Делать модуль глобальным? - PullRequest
       16

Делать модуль глобальным?

1 голос
/ 02 февраля 2010

Хотелось бы узнать, почему

 >>> def func2():
...     global time
...     import time
...
>>> time
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'time' is not defined
>>> func2()
>>> time
<module 'time' (built-in)>
>>>

работает, но

   >>> def func():
...     global module
...     module="time"
...     exec ("global %s" %module)
...     exec ("import %s" %module)
...
>>> time
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'time' is not defined
>>> func()
>>> time
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'time' is not defined

не работает, а как мне заставить его работать =) спасибо

Ответы [ 4 ]

7 голосов
/ 02 февраля 2010

Каждый из ваших вызовов exec() происходит в отдельном пространстве имен. Отказаться от этого пути; это приведет только к гибели.

1 голос
/ 02 февраля 2010

Чтобы импортировать модуль с указанным именем в виде строки, используйте

time=__import__('time')

Вот один из способов, которым вы можете его использовать

usermodulenames = ["foo","bar","baz"]
usermodules = dict((k,__import__(k)) for k in usermodulenames)
1 голос
/ 02 февраля 2010

Поскольку exec использует свою собственную область по умолчанию. Если вы сделаете exec "global {0}; import {0}".format(module) in globals(), то это сработает.

Вы не должны этого делать, если только вам это не нужно.

0 голосов
/ 02 февраля 2010

То, что вы пытаетесь сделать, является либо очень сложным, либо очень странным. Вот как это работает:

exec ("import %s" % module) in globals()

Пожалуйста, опишите большую проблему, которую вы пытаетесь решить

...