2017-02-15 4 views
1

내가 이해하지 못하는 표준 라이브러리의 shutil 모듈에 일부 코드가 있습니다.`<=`는 파이썬 세트와 불린으로 무엇을합니까?

_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} 모든 기능이 있고, <=에 대한 권리 주장은 부울처럼 보이지만 소스에 따라 그들이 함수와 함수 세트.

나는 파이썬 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

파이썬 2의 소스 코드는 무엇입니까? 거기에서,'set'을'boolean'과 비교하는 것은'TypeError'를 던지지 않습니다. 나는 (그런 행동이 제거 된 이유의 일부인) 규칙을 기억하지 못한다.하지만 영리한 일이 여기서 벌어지고있다. –

+0

{lambda : x + 1}에서'{lambda : x} <= (lambda x : x + 1)'가 파이썬 2.7 btw에서'False'를 반환한다는 것을 정말로 이해하지 못합니다. – roganjosh

+0

@ juanpa.arrivillaga 내가 읽은'shutil '경로는'C : \ Python35 \ Lib \ shutil.py'이다. 나는 그것이 파이썬 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 함수의 집합입니다.

andlower precedence보다 <=이 있으므로 먼저 세트 비교가 평가됩니다. set의 경우이 연산자는 두 번째 집합의 첫 번째 집합 is a subset이 있는지 확인합니다.

os.supports_dir_fd은 수행 할 수있는 파일 작업의 종류를 나열합니다. 이것은 운영 체제마다 다를 수 있으므로 os 모듈은 현재 환경에 따라 다른 코드 경로를 사용합니다. 각 기능에 대해 _add은 현재 OS에서 허용되는지 확인합니다. 따라서 코드 조각의 의도는 작업 open, stat, unlinkrmdir이 지원되는지 확인한 다음 shutil이 사용하려고하는 특정 동작을 확인하는 것입니다. 결국 _use_fd_functions은 현재 환경에서 수행 할 수있는 작업에 따라 shutil에 파일 설명자 함수 ("fd")를 사용해야하는지 여부를 알려줍니다.

+1

어쩌면 저는 느리게 진행되고 있지만 원래 코드의 의도를 함께 모으기 위해 고심하고 있습니다. 당신은 높은 수준에서 그것을 말할 수 있습니까? – roganjosh

+0

나는 그것을 설명하려고 노력했다. –

+0

감사, 지금 내게 훨씬 더 의미가 있습니다. – roganjosh