【问题标题】:Modifying a variable in a module imported using from ... import *修改使用 from ... import * 导入的模块中的变量
【发布时间】:2011-01-21 12:02:58
【问题描述】:

考虑以下代码:

#main.py
From toolsmodule import *
database = "foo"

#toolsmodule
database = "mydatabase"

看起来,这会在每个模块中创建一个具有不同内容的变量。如何从 main 修改 toolsmodule 中的变量?以下方法不起作用:

toolsmodule.database = "foo"

【问题讨论】:

    标签: python python-3.x python-import


    【解决方案1】:

    听起来像是不使用from toolsmodule import *的众多充分理由中的又一个。

    如果你只是做import toolsmodule,那么你可以做toolsmodule.database = 'foo',一切都很棒。

    【讨论】:

    • 我知道这一点,但我经常使用这些变量,我的模块名称很长,我想避免额外的输入。
    • 所以使模块名称简短:import longmodulename as sname。现在sname 将引用longmodulename
    • 如果您不想每次都输入toolsmodule,您可以执行以下操作:import toolsmodule as tm。这样您就可以保持命名空间的健全并节省输入。
    • 如果您真的想使用 toolsmodule.* 向主命名空间发送垃圾邮件,只需同时使用这两种技术:import toolsmodule; from toolsmodule import *
    【解决方案2】:

    Python 的变量名只是变量上的标签。当您import * 所有这些标签都是本地的,然后当您设置数据库时,您只需替换本地变量,而不是工具模块中的那个。因此,这样做:

    工具模块.py:

    database = "original"
    
    def printdatabase():
       print "Database is", database
    

    然后运行:

    import toolsmodule
    toolsmodule.database = "newdatabase"
    toolsmodule.printdatabase()
    

    输出是

    Database is newdatabase
    

    请注意,如果您随后从另一个模块也执行了import *,则不会反映更改。

    简而言之:永远不要使用from x import *。我不知道为什么所有新手都坚持这样做,尽管我知道的所有文档都说这是一个坏主意。

    【讨论】:

      【解决方案3】:

      你为什么不那样做:

      import toolsmodule
      toolsmodule.database = "foo"
      from toolsmodule import *  #bad idea, but let's say you have to..
      print database #outputs foo
      

      【讨论】:

      • 当我尝试这个时,我相信我最终无法从工具模块内部修改变量了。这需要验证。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 2014-04-10
      • 2012-06-05
      • 2018-03-11
      相关资源
      最近更新 更多