Jako przykład, powiedzmy, że mam zmienną określoną tam, gdzie może być wiele

from __ import *
from ____ import *

Itp.

Czy jest sposób, aby dowiedzieć się, gdzie zdefiniowano jedną z zmiennych w przestrzeni nazw?

edytuj

Dzięki, ale już rozumiem, że import * jest często uważany za słabą formę. To jednak nie było pytanie, aw każdym razie nie napisałem. Po prostu będzie miło mieć sposób na znalezienie, skąd pochodziła zmienna.

1
inman320 13 październik 2011, 23:16

4 odpowiedzi

Najlepsza odpowiedź

Dlatego jest uważany za zły formularz do używania from __ import * w Pythonie w większości przypadków. Albo użyj from __ import myFunc albo import __ as myLib. Wtedy, gdy potrzebujesz czegoś od myLib nie nadał coś innego.

Aby znaleźć różne rzeczy w obecnej przestrzeni nazw, sprawdź Biblioteka pprint,

Spencer Rathbun 13 październik 2011, 19:21

Nie, nazwiska zdefiniowane przez from blah import * nie zachowują żadnych informacji o tym, skąd pochodzą. Wartości mogą mieć na przykład wskazówki, klas mają atrybut __module__, ale mogły zostać zdefiniowane w jednym module, a następnie importowany z innego, więc nie możesz liczyć na nich, które się spodziewasz.

3
Ned Batchelder 13 październik 2011, 19:22

Na przykład:

>>> from zope.interface.common.idatetime import *
>>> print IDate.__module__
'zope.interface.common.idatetime'
>>> print Attribute.__module__
'zope.interface.interface'

Moduł Attribute może wydawać się zaskakujący, ponieważ nie jest to miejsce, gdzie importowało go z , ale jest to, gdzie zdefiniowano Attribute typ . Patrząc na zope/interface/common/idatetype.py, widzimy:

from zope.interface import Interface, Attribute

Który wyjaśnia wartość __module__. Będziesz również wpłynąć na problemy z instancjami typów importowanych z innych modułów. Przypuśćmy, że tworzysz instancję Attribute o nazwie att:

>>> att = Attribute('foo')
>>> print att.__module__
'zope.interface.interface'

Ponownie, ucząc się, gdzie pochodzą typ z , ale nie gdzie zdefiniowano zmienną.

Prawdopodobnie największym powodem, dla którego nie korzystanie z importu wieloznacznego jest to, że nie wiesz, co dostajesz i zanieczyszczają przestrzeń nazw i prawdopodobnie klobber inne typy / zmienne.

>>> class Attribute(object):
...    foo = 9
...
>>> print Attribute.foo
9
>>> from zope.interface.common.idatetime import *
>>> print Attribute.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Attribute' has no attribute 'foo'

Nawet jeśli dzisiaj działa bez kolizji, nie ma gwarancji, że nie stanie się z przyszłymi aktualizacjami importowanej pakietu.

1
Nathan 13 październik 2011, 21:05

Jeśli zadzwonisz do samej metody w tłumaczeniu, powie Ci, co są modułami macierzystymi.

Na przykład:

>>> from collections import *
>>> deque
<type 'collections.deque'>
0
Dan 13 październik 2011, 19:25