На самом деле, это не ошибка дизайна, и это происходит не из-за внутренних компонентов, а из-за производительности. Это происходит просто из-за того, что функции в Python являются первоклассными объектами, а не только частью кода.
Как только вы додумаетесь до этого, тогда это полностью имеет смысл: функция - объект, оцениваемый по его определению; параметры по умолчанию являются «данными-членами», и поэтому их состояние может меняться от одного вызова к другому - точно так же, как и к любому другому объекту.
В любом случае Effbot имеет очень хорошее объяснение причин это поведение в Значения параметров по умолчанию в Python . Я нашел это очень ясным, и я действительно предлагаю прочитать его, чтобы лучше узнать, как работают объекты функций.
Функция __import__
может быть немного трудно понять.
Если вы измените
i = __import__('matplotlib.text')
на
i = __import__('matplotlib.text', fromlist=[''])
, тогда i
будет ссылаться на matplotlib.text
.
В Python 2.7 и Python 3.1 или более поздней версии вы можете использовать importlib
:
import importlib
i = importlib.import_module("matplotlib.text")
Некоторые примечания
./feature/email.py
, код будет выглядеть как importlib.import_module("feature.email")
__init__.py
с файлом, который вы пытаетесь импортировать Я думаю, что importlib.import_module - это то, что вы ищете. (Доступно только для Python> = 2.7 или 3.x):
importlib.import_module('matplotlib.text')
imp.load_source(..)
с использованием модуля imp
, как предложено в этом ответе stackoverflow.com/questions/67631/…
– Evgeni Sergeev
8 June 2014 в 07:30
import moduleName
, где moduleName - строка. Как насчет from moduleName import *
?
– Nam G VU
30 May 2017 в 06:57
потратил некоторое время, пытаясь импортировать модули из списка, и это тот поток, который мне больше всего понравился, но я не понял использование ___import____ -
, поэтому вот как импортировать модуль из строки и получить то же поведение, что и импорт. И попробуйте / за исключением случая с ошибкой. :)
pipmodules = ['pycurl', 'ansible', 'bad_module_no_beer']
for module in pipmodules:
try:
# because we want to import using a variable, do it this way
module_obj = __import__(module)
# create a global object containging our module
globals()[module] = module_obj
except ImportError:
sys.stderr.write("ERROR: missing python module: " + module + "\n")
sys.exit(1)
и да, для python 2.7> у вас есть другие опции, но для 2.6 & lt ;, это работает.
importlib
должно быть доступно на pypi для & lt; python 2.7 – Jeffrey Jose 19 August 2012 в 13:12./feature/email.py
), код будет выглядеть какimportlib.import_module("feature.email")
– Seanny123 6 December 2013 в 09:13__init__.py
с файлом, который вы пытаетесь импортировать. – Seanny123 6 December 2013 в 09:31import moduleName
, где moduleName - строка. Как насчетfrom moduleName import *
? – Nam G VU 30 May 2017 в 06:47