我有一个Python模块,它有几个带有硬编码值的变量,它们在整个项目中使用。我想以某种方式将变量绑定到一个函数,以重定向到配置文件。这可能吗?在
# hardcoded_values.py
foo = 'abc'
bar = 1234
# usage somewhere else in another module
from hardcoded_values import *
print foo
print bar
我想做的是只改变hardcoded_values.py
,这样print foo
透明地调用一个函数。在
config.get_value
是使用变量foo
(如print foo
)时用参数'foo'
调用的函数。在
如果我理解正确,您希望每次尝试访问变量时都对
hardcoded_variables
模块求值。在我可能在文档中有
hardcoded_variables
(例如json?)以及自定义包装函数,如:我很确定,如果像
from hardcoded_values import *
那样导入,您将无法执行您想要的操作。在您要做的是将
foo
设置为某个函数,然后应用property
修饰符(或等效函数),以便可以将foo作为foo
而不是foo()
来调用。不能将属性修饰符应用于模块,原因如下:Why Is The property Decorator Only Defined For Classes?现在,如果你想
import hardcoded_values
,那么我想有一种方法可以做你想做的事情hardcoded_values.foo
。我有一种很好的感觉,我将要描述的是一个永远不应该使用的坏主意,但我认为它很有趣。在坏主意???
假设您想用某个函数替换一个常量,比如}。我们需要能够使用
os.EX_USAGE
,在我的系统中是64
,然后将其称为os.EX_USAGE
,而不是{property
修饰符,但为此我们需要一个module
以外的类型。在因此,可以做的是动态创建一个新类型,并在模块的
__dict__
中转储一个类型工厂函数,该函数以模块为参数:现在我将导入操作系统:
^{pr2}$现在我将创建一个类
OsClass
,并将名称os
绑定到该类的一个实例:一切似乎仍然有效。现在定义一个函数来替换
os.EX_USAGE
,注意它需要一个伪的self
参数:…并将类属性
OsClass.EX_USAGE
绑定到函数:当
os
对象调用它时,它会工作!现在只需应用属性装饰器:现在,模块中定义的常量已经被函数调用透明地替换了。在
如果模块的客户机代码使用
from hardcoded_variables import *
,则绝对不能这样做。这将引用另一个模块的名称空间中的hardcoded_variables
的内容,之后您将无法对它们执行任何操作。在如果客户机代码可以更改为只导入模块(例如
import hardcoded_variables
),然后访问它的属性(使用hardcoded_variables.foo
),那么您确实有机会,但是有点尴尬。在Python缓存导入到
sys.modules
(字典)中的模块。可以用其他对象(如自定义类的实例)替换该字典中的模块,并在访问对象属性时使用property
对象或其他描述符来实现特殊行为。在试着让新的
hardcoded_variables.py
看起来像这样(并且考虑重命名它!)公司名称:相关问题 更多 >
编程相关推荐