【问题标题】:Creating global variable from submodule available in entire module从整个模块中可用的子模块创建全局变量
【发布时间】:2015-12-30 07:53:28
【问题描述】:

假设我在一个名为mymod 的目录中有三个文件。这三个文件是__init__.pysm1.pysm2.py。模块内容如下:

__init__.py

import sm1
import sm2
global _defaults

sm1.py

global _defaults
class get_defs:
    color='blue'
    number=10    
_defaults = get_defs()

sm2.py

def printdefs():
    print _defaults.color
    print _defaults.number

所以,我要做的是在子模块sm1 中设置一个名为_defaults 的类,可以从模块或子模块中的任何其他位置访问它,以便子模块sm2 也可以访问和打印它班级。我以为这个设置会起作用,但是当我运行时

import mymod
mymod.sm2.printdefs()

我收到此错误:

NameError: global name '_defaults' is not defined

关于如何做到这一点的任何建议(以及为什么这不起作用?)

附:

我想要一个全局变量而不是仅仅设置一些要导入的变量的原因是我希望能够让用户这样做:

>>> import mymod
>>> mymod.sm2.printdefs()
'blue'
10
>>> mymod._defaults.color='red'
>>> mymod.sm2.printdefs()
'red'
10

所以,我认为只有使用全局变量才能像这样工作。

谢谢。

【问题讨论】:

  • 这并不是 python 真正的工作方式。这看起来更像是 rails 自动加载器。在使用 rails 之后,这是一件可怕的事情。
  • 你能给我推荐一个“首选”的方法吗?

标签: python module


【解决方案1】:

global 不是你这样做的方式。 sm1 应该只设置变量,然后所有其他模块应该只导入它。

sm1.py:

class get_defs:
    color='blue'
    number=10 
_defaults = get_defs()

sm2.py

import sm1
def printdefs():
    print sm1._defaults.color
    print sm1._defaults.number

但我真的不确定为什么你有一个全局的而不是某种工厂方法或类。如果您能提供有关实际项目的更多详细信息,那将很有帮助。

【讨论】:

  • 感谢您的尝试。我猜这非常接近,但请查看我的编辑,了解我想要完成的工作。
猜你喜欢
  • 2016-09-15
  • 2013-07-19
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
相关资源
最近更新 更多