我想控制全局变量(或全局范围的变量),使其在程序初始化代码中仅设置一次,然后将其锁定。
我对全局变量使用UPPER_CASE_VARIABLES,但是我想有一种确定的方法,无论如何不要更改变量。
Activestate有一个由古老的Alex
Martelli
撰写的题为“ Constants in
Python
”的食谱
,
用于创建具有创建后无法反弹的属性的模块。听起来像您在寻找什么,除了大写字母-
但这可以通过检查属性名称是否全部大写来添加。const
当然,这可以由有决心的人规避,但这就是Python的方式—并被大多数人视为“好事”。但是,要使其变得更困难一点,我建议您不要去添加所谓的显而易见的__delattr__
方法,因为人们可以随后删除名称,然后将其重新添加回不同的值。
这就是我要采取的措施:
# Put in const.py...
# from http://code.activestate.com/recipes/65207-constants-in-python
class _const:
class ConstError(TypeError): pass # Base exception class.
class ConstCaseError(ConstError): pass
def __setattr__(self, name, value):
if name in self.__dict__:
raise self.ConstError("Can't change const.%s" % name)
if not name.isupper():
raise self.ConstCaseError('const name %r is not all uppercase' % name)
self.__dict__[name] = value
# Replace module entry in sys.modules[__name__] with instance of _const
# (and create additional reference to it to prevent its deletion -- see
# https://stackoverflow.com/questions/5365562/why-is-the-value-of-name-changing-after-assignment-to-sys-modules-name)
import sys
_ref, sys.modules[__name__] = sys.modules[__name__], _const()
if __name__ == '__main__':
import __main__ as const # Test this module...
try:
const.Answer = 42 # Not OK to create mixed-case attribute name.
except const.ConstCaseError as exc:
print(exc)
else: # Test failed - no ConstCaseError exception generated.
raise RuntimeError("Mixed-case const names should't be allowed!")
try:
const.ANSWER = 42 # Should be OK, all uppercase.
except Exception as exc:
raise RuntimeError("Defining a valid const attribute should be allowed!")
else: # Test succeeded - no exception generated.
print('const.ANSWER set to %d raised no exception' % const.ANSWER)
try:
const.ANSWER = 17 # Not OK, attempt to change defined constant.
except const.ConstError as exc:
print(exc)
else: # Test failed - no ConstError exception generated.
raise RuntimeError("Shouldn't be able to change const attribute!")
输出:
const name 'Answer' is not all uppercase
const.ANSWER set to 42 raised no exception
Can't change const.ANSWER
问题内容: 我有很多自定义对象,需要对其执行独立(可并行化)的任务,包括修改对象参数。我试过同时使用Manager()。dict和’sharedmem’ory,但都没有用。例如: 打印出: 即对象没有被修改。 如何实现所需的行为? 问题答案: 问题在于,当将对象传递给工作进程时,它们会被泡菜包装,运送到另一个过程中,然后在其中解压缩并进行处理。您的对象没有像克隆的那样传递给其他过程。您不返回对象,
这是一个愚蠢的问题,但我正在开发一个AngularJS应用程序(一个简单的学校项目),我想知道是否有一种方法可以在chrome中运行JavaScript对象后,从chrome的开发工具中修改它。基本上,我有一个角色和一个怪物,我想编辑他们在战斗中的力量,以加快我的调试过程(避免在源代码中设置值,然后刷新页面)。 编辑:这就是答案。我只是不知道怎么找。:)
问题内容: 我正在尝试使用selenium和铬在网站中自动化一个非常基本的任务,但是以某种方式网站会检测到铬是由selenium驱动的,并阻止每个请求。我怀疑该网站是否依赖像这样的公开DOM变量https://stackoverflow.com/a/41904453/648236来检测selenium驱动的浏览器。 我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试
问题内容: 我正在尝试使用selenium和铬在网站中自动化一个非常基本的任务,但是以某种方式网站会检测到铬是由selenium驱动的,并阻止每个请求。我怀疑该网站是否依赖像这样的公开DOM变量来检测selenium驱动的浏览器。 我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试修改后重新尝试编译selenium源,但似乎无法在存储库中的任何地方找到Navigat
但它只在初始页加载后更新属性。我认为站点在我的脚本执行之前检测到了变量。
所以我一直在做一个游戏,到目前为止最大的问题是我们不能让玩家与球场上的任何物体相撞。相反,它们会直接穿过树。有人能告诉我为什么吗?以下是我尝试用于碰撞检测的代码: 这是理论上的声音还是我完全错了?