【问题标题】:How do I import variable packages in Python like using variable variables ($$) in PHP?如何在 Python 中导入变量包,如在 PHP 中使用变量变量 ($$)?
【发布时间】:2011-10-04 09:07:50
【问题描述】:

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

默认是file1.py:

from files import file1

如果用户选择file2,应该是:

from files import file2

在 PHP 中,我可以使用 variable variables

$file_name = 'file1';
include($$file_name);
$file_name = 'file2';
include($$file_name);

如何在 Python 中做到这一点?

【问题讨论】:

  • 不要这样做!使用输入通常不可信,并且基于它的盲目评估代码是个坏主意。
  • 谢谢,我现在使用默认设置导入。

标签: python variables variable-variables


【解决方案1】:

基于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,或者加载多个模块并将它们分配给一个字典,例如。

【讨论】:

    【解决方案2】:

    作为Fredrik Lundh states:

    不管怎样,下面是这些语句和函数的工作原理:

    import X 导入模块 X,并创建对该模块的引用 在当前命名空间中。或者换句话说,在你运行这个之后 声明,你可以使用X.name来引用模块X中定义的东西。

    from X import * 导入模块 X,并在 该模块定义的所有公共对象的当前命名空间(即 是,所有没有以“_”开头的名称的东西)。或在 换句话说,在你运行这条语句之后,你可以简单地使用 简单的名称来引用模块 X 中定义的东西。但 X 本身不是 已定义,因此 X.name 不起作用。如果名称已经定义,它 被新版本取代。如果 X 中的名称更改为指向 到其他对象,你的模块不会注意到。

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

    最后,X = __import__(‘X’)import X 一样工作,但有区别 您 1) 将模块名称作为字符串传递,以及 2) 显式分配 将其添加到您当前命名空间中的变量中。

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

    简单写(举例):

    var = "datetime"
    module = __import__(var)
    

    【讨论】:

      【解决方案3】:

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

      在 Python 2.7+ 中有一种更简洁的方法:

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

      【讨论】:

      • 提示:你需要一个package.path.__init__.py 来代替import to work
      【解决方案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】:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-09
          • 1970-01-01
          • 1970-01-01
          • 2013-05-16
          • 1970-01-01
          • 2021-07-11
          相关资源
          最近更新 更多