我有一个包含许多模块的包.每个模块使用我在每个文件中独立定义的常量.但是,所有这些常量必须相互一致.所以我尝试在一个文件中定义它们并将其导入每个文件中.当我运行它时,我找不到常量的常量错误.
他们是一个干净的方式让一个文件由许多其他人导入并包含常量?
谢谢你的帮助
我发现了与此问题相关的一些模糊的问题,但没有找到任何针对CPython的干净且特定的解决方案。我认为“有效”解决方案是特定于解释器的。
首先,我认为我了解:
locals() 给出了不可修改的字典。frame.f_locals给出了locals()类似的字典,但不太容易通过hackhacking exec。或至少我没有能力做些骇人听闻的未证明的事情,例如locals()['var'] = value ; exec ""exec 能够对局部变量做一些奇怪的事情,但它并不可靠-例如,我读到某处它在Python 3中不起作用。未经测试。因此,我了解到,鉴于这些限制,向局部变量添加额外的变量永远是不安全的,因为这会破坏解释器的结构。
但是,应该可以更改已经存在的变量,不是吗?
我考虑过的事情
f,可以访问f.func_code.co_nlocals和f.func_code.co_varnames。frame.f_locals。这是通过设置跟踪器的用例sys.settrace。变量应该在某个地方,最好是可写的...但是我找不到它。即使它是一个数组(用于有效的解释器访问),或者我需要一些额外的C特定接线,我也准备提交。
如何从跟踪函数或修饰的包装函数或类似的东西实现对变量的修改?
完整的解决方案当然会受到赞赏,但即使是某些指针也会对我有很大帮助,因为我在这里遇到了很多不可写的字典:-/
我正在阅读这个问题中提到的 Alex Martelli 的这段代码。我知道这告诉你你当前所在的模块,但是他末尾的这行代码确实让我感到困惑。在文件末尾声明当前模块的语句的含义和意义是什么?sys.modules[__name__]constant.py
# Put in const.py...:
class _const:
class ConstError(TypeError): pass
def __setattr__(self,name,value):
if self.__dict__.has_key(name):
raise self.ConstError, "Can't rebind const(%s)"%name
self.__dict__[name]=value
import sys
sys.modules[__name__]=_const() #this I don't understand
# that's all -- now any client-code can
import const
Run Code Online (Sandbox Code Playgroud)
基本上,我的问题是,在我看来,这行代码没有做任何事情;我理解错了吗?由于在 Python 中,您不必将类定义放在单独的文件中,因此我认为我并不真正需要两个模块,除非我想重用“const”类。那么在这种情况下sys.moldules[__name__]=_const()也没有必要......我理解正确吗?
我根据https://docs.python.org/3.3/extending/extending.html在C中实现了一个python扩展模块
现在我想在该模块中有整数常量,所以我做了:
module= PyModule_Create(&myModuleDef);
...
PyModule_AddIntConstant(module, "VAR1",1);
PyModule_AddIntConstant(module, "VAR2",2);
...
return module;
Run Code Online (Sandbox Code Playgroud)
这有效.但我可以修改python中的"常量",比如
import myModule
myModule.VAR1 = 10
Run Code Online (Sandbox Code Playgroud)
我试图重载__setattr__,但在赋值时不调用此函数.
有解决方案吗?
可能重复:
在Python中创建常量
Python是否支持由解释器强制执行的常量?例如:整数常量.程序员如何定义枚举类型?
我正在做一个简单的测试以验证可变性我有一个变量 var
我想验证=赋值运算符是否正在为此更改相同存储位置的值
var = 1
要打印var我的 地址
hex(id(var))它给了我'0x1b65158'然后我分配了新值,var = 2但现在hex(id(var))更改为'0x1b65140'如果它更改了相同的位置,应该返回相同的值吗?请解释
注意:我不想做这里提到的相同任务。我试图了解它是如何可变分配的。而且我不想在这里创建常量。