2015-01-22 1 views
0

미리 정의 된 특정 클래스 목록 만 파이썬 모듈에서 가져올 수 있습니까? b.py 원인 물론, print Foo 라인이 NameError 인상을 실행모듈에서 클래스 목록을 어떻게 가져 옵니까?

#a.py 
class Foo(object): 
    '''definition of class Foo goes here''' 

class Bar(object): 
    '''definition of class Bar goes here''' 

aTypes = [Foo, Bar] 

_

#b.py 
from a import aTypes 

print Foo 

예를 들어, 내가 모듈에 다음 코드와 같은 디렉토리에 a.pyb.py 있다고 말한다. 나는 이것이 작동 할 것이라고 정말로 생각하지 못했다. (b.py의 import 문은 Foo 타입 대신에 a.Foo 타입을 제공한다.) 그러나 올바른 구문을 이해할 수는 없다. 원하는 동작을 제공하는 from a import aTypes의 대안이 있습니까?

답변

1

다음, 당신이 정말로 (유형의 목록을 거래)이 작업을 수행 할 필요가 않고 한 번만 (모듈 당 하나의 특별한 목록)를 작동 __all__ 같은 트릭을 사용할 수 없습니다 치죠 :

def gettypes(types): 
    thismodule = sys.modules[__name__] 
    for t in types: 
     setattr(thismodule, t.__name__, t) 

이처럼 사용 ,

import a 
gettypes(a.aTypes) 

난 당신이 필요 했어 왜 어려운 상상 찾는거야,하지만 그건 내 문제 ;-) __name__의 사용이 일반적으로 기호를 작동하지 않습니다 의미

참고 아니다 클래스, 모듈, 함수 및 다른 용도로만 사용할 수 있습니다. 얻은 (또는 __name__을 가진 당신의 자신의 디자인의 목표를위한 꼬집음에). 예를 들어 모듈에 Baz = Bar을 쓰고 목록에 Baz을 쓰는 등 모듈에서 별칭을 지정한 항목에 대해서는 작동하지 않습니다. 목록이 [Foo, Bar] 대신 ['Foo', 'Bar']이고 소스 모듈을 gettypes으로 전달한 경우 이러한 제한을 피할 수 있습니다.

+0

'gettypes'의 첫 번째 인수는 필요하지 않습니까? – Eithos

+0

당신이 맞습니다. –

4

직접 이름을 가져올 수 :

__all__ = ['Foo', 'Bar'] 

다음 b.py에 와일드 카드 가져 오기를 수행합니다 :

from a import Foo, Bar 

또는, 당신이 __all__a.py에를 정의 할 수

from a import * 

그래도 이름이 두 개인 경우 첫 번째 솔루션을 더 쉽게 사용할 수 있습니다.

__all__ = ['Foo', 'Bar'] 

이것은 다음과 같은 방법으로 가져올 수 있습니다 : 당신은 a.py의 모듈 수준에서 __all__을 정의 할 수 있습니다

+0

더 쉬울뿐만 아니라 아마도 가장 좋습니다. 이렇게하면 누구나 파일의 맨 위를보고 심볼이 어디에서 왔는지 알 수 있습니다. –

0

물론

from a import * 

이 동작은 항상하지 않습니다 격려하고 대안이 선호된다 :

from a import Foo, Bar