我是一名刚接触 Python 的 RoR 程序员。我试图找到允许我将变量设置为特定值的语法,前提是它之前没有分配。基本上我想要:
# only if var1 has not been previously assigned
var1 = 4
我是一名刚接触 Python 的 RoR 程序员。我试图找到允许我将变量设置为特定值的语法,前提是它之前没有分配。基本上我想要:
# only if var1 has not been previously assigned
var1 = 4
您应该将变量初始化为 None 然后检查它:
var1 = None
if var1 is None:
var1 = 4
可以写成一行:
var1 = 4 if var1 is None else var1
或使用快捷方式(但建议检查无)
var1 = var1 or 4
或者,如果您没有为变量分配任何内容,则该变量名称不存在,因此稍后使用该变量将 raise NameError
,您也可以使用该知识来做这样的事情
try:
var1
except NameError:
var1 = 4
但我建议不要这样做。
var1 = var1 or 4
这可能存在的唯一问题是,如果 var1 是一个虚假值,例如 False 或 0 或 [],它将选择 4。这可能是个问题。
这是一种非常不同的编程风格,但我总是尝试重写看起来像的东西
bar = None
if foo():
bar = "Baz"
if bar is None:
bar = "Quux"
变成:
if foo():
bar = "Baz"
else:
bar = "Quux"
也就是说,我尽量避免出现一些代码路径定义变量而另一些不定义的情况。在我的代码中,从来没有一个路径会导致定义变量集的歧义(事实上,我通常会更进一步,并确保无论代码路径如何,类型都是相同的)。这可能只是个人喜好问题,但我发现这种模式虽然在我写它时不太明显,但当我稍后阅读它时更容易理解。
我也来自 Ruby,所以我喜欢它的语法foo ||= 7
。
这是我能找到的最接近的东西。
foo = foo if 'foo' in vars() else 7
我见过人们为 dict 这样做:
try:
foo['bar']
except KeyError:
foo['bar'] = 7
更新: 但是,我最近发现了这个宝石:
foo['bar'] = foo.get('bar', 7)
如果您喜欢这样,那么对于常规变量,您可以执行以下操作:
vars()['foo'] = vars().get('foo', 7)
这是我使用的最简单的方法,希望对你有用,
var1 = var1 or 4
仅当is或4
_ _var1
var1
None
False
0
IfLoop 的答案(和 MatToufoutu 的评论)非常适合独立变量,但我想为任何尝试对列表、元组或字典中的单个条目执行类似操作的人提供答案。
字典
existing_dict = {"spam": 1, "eggs": 2}
existing_dict["foo"] = existing_dict["foo"] if "foo" in existing_dict else 3
退货{"spam": 1, "eggs": 2, "foo": 3}
列表
existing_list = ["spam","eggs"]
existing_list = existing_list if len(existing_list)==3 else
existing_list + ["foo"]
退货["spam", "eggs", "foo"]
元组
existing_tuple = ("spam","eggs")
existing_tuple = existing_tuple if len(existing_tuple)==3 else
existing_tuple + ("foo",)
退货("spam", "eggs", "foo")
(不要忘记("foo",)
定义“单个”元组的逗号。)
如果您想做的不仅仅是检查长度并附加到末尾,那么列表和元组解决方案将更加复杂。尽管如此,这给人一种你可以做的事情的感觉。
这里的单线解决方案:
var1 = locals().get("var1", "default value")
NameError
此解决方案将设置var1
为default value
ifvar1
尚未定义,而不是具有。
这是它在 Python 交互式 shell 中的样子:
>>> var1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'var1' is not defined
>>> var1 = locals().get("var1", "default value 1")
>>> var1
'default value 1'
>>> var1 = locals().get("var1", "default value 2")
>>> var1
'default value 1'
>>>
如果您的意思是模块级别的变量,那么您可以使用“全局变量”:
if "var1" not in globals():
var1 = 4
但是常见的 Python 习惯用法是初始化它说None
(假设它不是一个可接受的值),然后用if var1 is not None
.