我知道你可以在 Python 中做这样的事情:
var = value1 if( booleanCheck() ) else value2
我想知道的是,我是否可以有条件地选择具有类似结构的值放入哪个 var?
像这样的东西:
(var1 if( booleanCheck() ) else var2) = value
就我而言,特别是我试图将一个子节点分配给二叉搜索树中的正确一侧,我知道我可以做一个正常的 if 块,但我试图挑战自己使用最小的空间。
我知道你可以在 Python 中做这样的事情:
var = value1 if( booleanCheck() ) else value2
我想知道的是,我是否可以有条件地选择具有类似结构的值放入哪个 var?
像这样的东西:
(var1 if( booleanCheck() ) else var2) = value
就我而言,特别是我试图将一个子节点分配给二叉搜索树中的正确一侧,我知道我可以做一个正常的 if 块,但我试图挑战自己使用最小的空间。
理论上你可以做这样的事情,如果两个变量都已经定义:
var1, var2 = (value, var2) if booleanCheck() else (var1, value)
不过,并不是说你应该这样做。
由于用例分配给二叉树的正确一侧,我假设分配目标实际上是某个树节点的属性,通常的代码是
if condition:
node.left = value
else
node.right = value
此代码可以替换为
setattr(node, "left" if condition else "right", value)
或者
vars(node)["left" if condition else "right"] = value
它可以被这个取代,但它真的不应该。
locals
使用或以这种方式使用不是很好的形式globals
(令人困惑,不经常使用,难以调试,性能糟糕),但可以做到:
varname = 'a' if some_condition else 'b'
locals()[varname] = value # or globals()
print locals()[varname] # or globals()
我认为这里真正的挑战是抵制看似“花哨”或“创造性”的代码,并编写其他人会立即理解的代码。更不用说你自己,如果你以后必须回来。但值得知道时髦的代码(如旧奶酪中的代码)是什么样的。
不像locals()
,globals()
被记录为可更新的(因为它返回__dict__
当前模块的)。我经常vars()
在全局范围内使用 -在这种情况下是相同的- 以减少代码重复:
for v,ar in ('a',x),('b',y): vars()[v]=fn(ar)
对于其他一些对象(如当前类/实例),__dict__
的成员也可以作为语法变量访问:
class C:
def __init__(self,a,b):
vars(self).update(v,locals()[v] for v in 'a','b')
do_something(self.a)
但是,请注意:
pylint
.dict
:此类变量在某种程度上往往是“同质的”,要求在数组操作中使用,因此可能应该组合到专用容器中反而。