2017-02-15 6 views
1

私は理解できない標準ライブラリのshutilモジュールにいくつかのコードを見つけました。`<=`はPythonの集合とブール値で何をするのですか?

_use_fd_functionsはtruthy/falsy値を保持してしまい、それは次のように初期化されています:

_use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= 
        os.supports_dir_fd and 
        os.listdir in os.supports_fd and 
        os.stat in os.supports_follow_symlinks) 

{os.open, os.stat, os.unlink, os.rmdir}全ての機能があり、かつ<=に右引数は、ブール値のように見えますが、ソースによると、彼ら機能と機能のセット。

私は、Python 3.5.2 REPLで、この動作を再作成することができませんでした:(トレースバックが取り除か)もちろん

>>> {lambda x: x} <= True 
TypeError: unorderable types: set() <= bool() 
>>> {True} <= True 
TypeError: unorderable types: set() <= bool() 
>>> {lambda x: x} <= (lambda x: x+1) 
TypeError: unorderable types: set() <= function() 
>>> {lambda x: x} <= (lambda x: x+1) in {lambda x: x+1} 
TypeError: unorderable types: set() <= function() 

、経験豊富な開発者は数秒でコードを解読することができませんでしたから、コードがスマートになっています。しかし、それはどのように機能し、何がしますか?

+0

Python 2のソースコードはありますか?そこでは、 'set'を' boolean'と比較することは 'TypeError'を投げません。私は規則(そのような行動が取り除かれた理由の一部です)を覚えていませんが、ここでは賢明なことが起こっています。 –

+0

これは何をするのか分かりませんが、{lambda:x + 1}の '{lambda:x} <=(lambda x:x + 1)'はPython 2.7 btwで 'False'を返します。 – roganjosh

+0

@ juanpa.arrivillaga私が読んだ 'shutil'へのパスは' C:\ Python35 \ Lib \ shutil.py'です。私はそれがPython 3.5であることを期待しています。 –

答えて

6

あなたの答えはos moduleにあります

_set = set() 
_add("HAVE_FACCESSAT", "access") 
_add("HAVE_FCHMODAT", "chmod") 
_add("HAVE_FCHOWNAT", "chown") 
_add("HAVE_FSTATAT", "stat") 
_add("HAVE_FUTIMESAT", "utime") 
_add("HAVE_LINKAT",  "link") 
_add("HAVE_MKDIRAT", "mkdir") 
_add("HAVE_MKFIFOAT", "mkfifo") 
_add("HAVE_MKNODAT", "mknod") 
_add("HAVE_OPENAT",  "open") 
_add("HAVE_READLINKAT", "readlink") 
_add("HAVE_RENAMEAT", "rename") 
_add("HAVE_SYMLINKAT", "symlink") 
_add("HAVE_UNLINKAT", "unlink") 
_add("HAVE_UNLINKAT", "rmdir") 
_add("HAVE_UTIMENSAT", "utime") 
supports_dir_fd = _set 

os.supports_dir_fdは、関数の集合です。

andにはlower precedence,<=がありますので、最初に設定された比較が評価されます。 setの場合、このオペレータは、第2セットの最初のセットis a subsetがあるかどうかをチェックします。

os.supports_dir_fdには、実行できるファイル操作の種類が記載されています。これはオペレーティングシステムによって異なる可能性がありますので、osモジュールは現在の環境に応じて異なるコードパスをとります。各機能について、_addは現在のOSで許可されているかどうかをチェックします。したがって、あなたが求めているコードスニペットの目的は、openstatunlink、およびrmdirのオペレーションがサポートされているかどうかを確認してから、shutilが使用したい特定の動作を確認することです。最後に、_use_fd_functionsは、現在の環境でできることに応じて、shutilにファイル記述子関数( "fd")を使用するかどうかを指示します。

+1

おそらく私は遅いですが、私はこれから元のコードの意図をまとめるのに苦労しています。あなたはそれを高いレベルで述べることができますか? – roganjosh

+0

私もそれを説明しようとしました。 –

+0

感謝して、それは今私にとってはもっと意味がある – roganjosh

関連する問題