Подтвердить что ты не робот

Как импортировать пакеты переменных в 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?

4b9b3361

Ответ 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.