在Python中使用字典(dict)键时,似乎有一些通用的方法:
some_dict['key_name'] # string constants everywhere
some_dict[KeyConstants.key_name] # where class KeyConstants: key_name: 'key_name'
some_dict[KEY_NAME] # with from some_module import KEY_NAME # a module level constant
'key_name'的缺点是你在整个代码中重复常量.这不是干的.更糟糕的是,如果您要发布您的API(从最广泛的意义上说),您将让API的消费者在任何地方重复这些常量,如果您想要将'key_name'更改为'better_key_name',那将是一个重大变化.
这是键入的语言DRY方法,常量合并在一个地方.它唯一的缺点是它丑陋,可读性稍差,而且更冗长.Pythonic原则主要禁止这样做.它允许您轻松更改表示键的常量,因为每个人都在对变量KeyConstants.key_name进行编码.它也适用于IDE进行重构.
PEP 8样式指南中建议使用模块级常量.ALL_CAPS_ARE_LOUD并且难以输入.这具有选项1和2的一些优点.
dict键常量有哪些其他最佳实践?以上哪种方法是首选的,何时?
可能重复:
如何以编程方式设置全局(模块)变量?
我有一个名为Variable的类定义如下:
class Variable():
def __init__(self, name):
self.name = name
self._value = None
def value(self):
return self._value
def __repr__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
我想创建26个大写的单字母变量实例,如下所示:
A = Variable('A')
B = Variable('B')
...
Z = Variable('Z')
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试了各种解决方案,我提出的最好的解决方案是:
from string import uppercase
for char in uppercase:
exec "%s = %s" % (char, Variable(str(char))) in None
Run Code Online (Sandbox Code Playgroud)
但是,这不会运行并给我这个错误:
Traceback (most recent call last):
File "C:\Users\Administrator\Dev\python\truthtable\truthtable.py", line 7, in <module>
exec "%s = %s" % (char, Variable(str(char))) in None
File "<string>", line 1, in <module>
NameError: name …Run Code Online (Sandbox Code Playgroud) 我已经习惯了编写像这样工作的函数:
def f():
if sunny:
return
#do non-sunny stuff
Run Code Online (Sandbox Code Playgroud)
我试图找出在模块中使用的等效语法.我想做这样的事情:
if sunny:
import tshirt
#do something here to skip the rest of the file
import raincoat
import umbrella
#continue defining the module for non-sunny conditions
Run Code Online (Sandbox Code Playgroud)
我知道我可以把它写成一个,if/else但是缩进模块的其余部分似乎很愚蠢.
我可以将其余的代码移动到一个单独的模块中并有条件地导入它,但这看起来很痛苦.