2015-01-22 1 views
0

Есть ли способ импортировать только определенный, предопределенный список классов из модуля Python? Например, говорят, что у меня были модули a.py и b.py в той же директории со следующим кодом:Как вы импортируете список классов из модуля?

#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 

Запуск b.py причины, конечно, print Foo линия поднять NameError. Я действительно не думал, что это сработает (оператор import в b.py дает мне тип a.Foo вместо типа 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

Вы можете импортировать имена непосредственно:

from a import Foo, Bar 

В качестве альтернативы, вы можете определить __all__ в a.py:

__all__ = ['Foo', 'Bar'] 

, а затем сделать импорт подстановочные в b.py:

from a import * 

Однако для двух имен это будет проще использовать первое решение.

+0

Не только проще, но, вероятно, лучше всего. Таким образом, любой может знать, откуда символ, просто глядя на верхнюю часть файла. –

0

Вы можете определить __all__ на уровне модуля a.py:

__all__ = ['Foo', 'Bar'] 

Это позволит вам импортировать его следующим образом:

from a import * 

Конечно, такое поведение не всегда рекомендуется и альтернатива является предпочтительной:

from a import Foo, Bar 

 Смежные вопросы

  • Нет связанных вопросов^_^