Как импортировать пакеты переменных в Python, как использовать переменные переменные ($$) в PHP?
Я хочу импортировать некоторый пакет в зависимости от того, какое значение пользователь выбирает.
По умолчанию используется file1.py
:
from files import file1
Если пользователь выбирает file2
, он должен быть:
from files import file2
В PHP я могу сделать это с помощью переменных переменных:
$file_name = 'file1';
include($$file_name);
$file_name = 'file2';
include($$file_name);
Как я могу сделать это в Python?
Ответы
Ответ 1
Python не имеет функции, которая прямо эквивалентна "переменным переменным" PHP. Чтобы получить значение переменной переменной (или значение любого другого выражения), вы можете использовать функцию eval
.
foo = "Hello World"
print eval("foo")
Однако это не может использоваться в инструкции import
.
Для импорта с использованием переменной можно использовать функцию __import__
.
package = "os"
name = "path"
imported = getattr(__import__(package, fromlist=[name]), name)
эквивалентно
from os import path as imported
Ответ 2
Старый поток, но мне нужен был ответ, поэтому кто-то еще мог...
В Python 2.7 + есть более чистый способ:
import importlib
my_module = importlib.import_module("package.path.%s" % module_name)
Ответ 3
Как Фредрик Лунд утверждает:
В любом случае, как работают эти утверждения и функции:
import X
импортирует модуль X и создает ссылку на этот модуль в текущем пространстве имен. Или, другими словами, после того, как вы запустите это вы можете использовать X.name
для обозначения вещей, определенных в модуле X.
from X import *
импортирует модуль X и создает ссылки в текущее пространство имен ко всем общедоступным объектам, определенным этим модулем (это есть, все, что не имеет имени, начинающегося с "_" ). Или в другими словами, после выполнения этого утверждения вы можете просто использовать простое имя, чтобы ссылаться на вещи, определенные в модуле X. Но сам X не, поэтому X.name
не работает. И если имя уже определено, оно заменяется новой версией. И если имя в X изменено на точку к другому объекту, ваш модуль не заметит.
from X import a, b, c
импортирует модуль X и создает ссылки в текущее пространство имен для данных объектов. Или, другими словами, вы можете теперь используйте a
и b
и c
в вашей программе.
Наконец, X = __import__(‘X’)
работает как import X
, с разницей что вы 1) передаете имя модуля в виде строки и 2) явно назначаете это переменной в вашем текущем пространстве имен.
И, кстати, последний метод, в который вас интересуют.
Просто напишите (например):
var = "datetime"
module = __import__(var)
Ответ 4
Вероятно, очень плохая идея позволить пользователю выбрать, что импортировать. Пакеты могут выполнять код при импорте, поэтому вы фактически позволяете пользователю произвольно выполнять код в вашей системе! Гораздо безопаснее делать что-то вроде
if user_input == 'file1.py':
from files import file1 as file
elif user_input == 'file2.py':
from files import file2 as file
else:
file = None
print "Sorry, you can't import that file"
Ответ 5
Основываясь на ответе mattjbray
:
from importlib import import_module
# lookup in a set is in constant time
safe_names = {"file1.py", "file2.py", "file3.py", ...}
user_input = ...
if user_input in safe_names:
file = import_module(user_input)
else:
print("Nope, not doing this.")
Сохраняет несколько строк кода и позволяет вам программно устанавливать safe_names
или загружать несколько модулей и назначать их, например, dict.