2013-09-23 2 views
2

나는 이렇게하고 싶니?__all__을 확장합니다. 모듈 __all__ 목록을 어떻게 가져올 수 있습니까?

# __init__.py 
import a_module 

__all__ = [ 
    'a_module', 
] 

__all__.extend(a_module.__all__) # it doesn't work 
# AttributeError: 'module' object has no attribute '__all__' 

어떻게 할 수 있습니까?

+1

당신이 "작동하지 않는"무엇을 의미합니까 ? 오류가 있습니까? – alecxe

+0

@alecxe 약간의 설명을 추가했습니다 – kharandziuk

답변

6

UPDATE :

from a_module import * 

을 ... 당신이 원하는 모든 모든 a_module가 발행 게시 다시 경우이 심지어는 ... : 당신은 그냥하지 않는 이유 나는 보지 않는다 PEP8이 별 수입의 사용을 "제재"하는 경우, 이는 일반적으로 낙담한다.

... 위의 솔루션은 여기에, 당신을 위해 일하는 더 많거나 적은 손으로 쓴 것에 상응되지 않습니다 경우 : (. 포함을 모듈)

dir() 객체 당신에게 속성의 목록을 제공한다 :

__all__.extend(dir(a_module)) 

그냥, ___로 시작하는 물건을 필터링하려는 경우 :

__all__.extend(x for x in dir(a_module) if not x.startswith('_')) 

는이 S 모듈이 __all__으로 선언되었는지 여부에 관계없이 작동 할 수 있습니다.

그리고, 완전히 모방 __all__ 선언하지 않는 한, 공공 등의 모듈에서 모든 비 밑줄 - 접두사 것을 고려 파이썬의 기본 동작 :

+0

자신에게 적합합니다. 다음과 같은 경우에 3 진을 선호합니다 :이 경우에는 '__all __. extend (...)'부분을 복제하지 않는 장점이 있습니다. 논리, 그래서 그것은 완전히 건조합니다. 그러나'if-else' (다른 모든 언어 부분과 마찬가지로)가 표현식이며 중첩 될 수있는 함수형 프로그래밍 스타일에 좀 더 익숙합니다. –

+0

인라인 대신 블록 if ... else 문을 쓰는 것이 좋습니다. 경우에 따라 인라인이 마법처럼 보일 수도 있습니다. – kharandziuk

+0

뭔가 마술처럼 보이거나 정상적이거나 멋지더라도 실제로 익숙한 것, 배경은 무엇인지, 한 가지/스타일을 다른 스타일보다 좋아하는 일반적인 경향이 있습니다. 그러나'a_module import * '가 왜 여러분의 필요에 맞지 않는지 더 알고 싶습니다. –