如何在 Python 中导入变量包,例如在 PHP 中使用变量变量 ($$)?

How do I import variable packages in Python like using variable variables ($$) in PHP?

提问人:skargor 提问时间:7/13/2011 最后编辑:Jeremyskargor 更新时间:11/21/2013 访问量:55625

问:

我想根据用户选择的值导入一些包。

默认值为 :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 中做到这一点?

python 变量

评论

3赞 Noufal Ibrahim 7/13/2011
别这样!使用输入通常不值得信赖,并且基于它盲目地评估代码是一个坏主意。
0赞 skargor 7/13/2011
谢谢,我现在使用默认设置为导入。

答:

39赞 Gandi 7/13/2011 #1

正如 Fredrik Lundh 所说:

无论如何,以下是这些语句和函数的工作方式:

import X导入模块 X,并创建对该模块的引用 在当前命名空间中。或者换句话说,在你运行这个之后 语句,可用于引用模块 X 中定义的内容。X.name

from X import *导入模块 X,并在 当前命名空间到该模块定义的所有公共对象( 是,所有没有名称以“_”开头的东西)。阿宁 换句话说,在运行此语句后,只需使用 纯名称来引用模块 X 中定义的内容。但 X 本身不是 定义,所以不起作用。如果名称已经定义,它 被新版本取代。如果 X 中的名称更改为 point 对于其他对象,您的模块不会注意到。X.name

from X import a, b, c导入模块 X,并在 给定对象的当前命名空间。或者换句话说,您可以 现在在您的程序中使用 和 和 。abc

最后,X = __import__('X') 的工作方式类似于导入 X,但不同之处在于 您 1) 将模块名称作为字符串传递,以及 2) 显式分配 它复制到当前命名空间中的变量。

顺便说一句,这是你感兴趣的最后一种方法。

只需写(例如):

var = "datetime"
module = __import__(var)
81赞 Jeremy 7/13/2011 #2

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
5赞 mattjbray 7/13/2011 #3

让用户选择要导入的内容可能是一个非常糟糕的主意。包可以在导入时执行代码,因此您实际上允许用户在您的系统上任意执行代码!做这样的事情要安全得多

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"
46赞 Dan Copeland 5/8/2013 #4

旧线程,但我需要答案,所以其他人可能仍然......

在 Python 2.7+ 中,有一种更简洁的方法可以做到这一点:

import importlib


my_module = importlib.import_module("package.path.%s" % module_name)

评论

0赞 Bob Stein 8/30/2015
提示:您需要一个导入才能正常工作package.path.__init__.py
6赞 sleblanc 11/21/2013 #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