在编写 Python 代码时,我经常发现自己想要获得类似于 Lisp 的 defvar 的行为。基本上,如果某个变量不存在,我想创建它并为其分配一个特定的值。否则,我不想做任何事情,特别是,我不想覆盖变量的当前值。
我在网上四处寻找,发现了这个建议:
try:
some_variable
except NameError:
some_variable = some_expensive_computation()
我一直在使用它,效果很好。但是,对我来说,这看起来是范式不正确的代码。代码是四行,而不是 Lisp 中所需的 1 行,并且它需要异常处理来处理不是“异常”的事情。
上下文是我正在进行交互式开发。我经常执行我的 Python 代码文件,因为我改进了它,我不想每次都运行 some_expensive_computation() 。我可以安排在每次启动新的 Python 解释器时手动运行 some_expensive_computation(),但我宁愿做一些自动化的事情,特别是这样我的代码就可以非交互地运行。熟练的 Python 程序员将如何实现这一点?
我在 SP3 中使用 WinXP,通过 Anaconda 1.6.2(32 位)使用 Python 2.7.5,并在 Spyder 中运行。
请您参考如下方法:
依赖具有意义的变量的存在与否通常不是一个好主意。相反,使用标记值来指示变量未设置为适当的值。 None 是这种哨兵的常见选择,但如果这是昂贵计算的可能输出,则可能不合适。
因此,不要使用您当前的代码,而是执行如下操作:
# early on in the program
some_variable = None
# later:
if some_variable is None:
some_variable = some_expensive_computation()
# use some_variable here
或者,None 可能是一个重要值的版本:
_sentinel = object()
some_variable = _sentinel # this means it doesn't have a meaningful value
# later
if some_variable is _sentinel:
some_variable = some_expensive_computation()
