我想总结一下下面的代码。它应该做的是检查计算中的变量是否被赋值。如果不是,则结果将为零。因为我有成百上千个这样的计算,所以我不想重复尝试--除了每个计算。
我怎么能这么做呢?
a = 1
b = 2
d = 3
f = 2
try:
ab = a + b
except:
ab = 0
try:
ac = a - c
except:
ac = 0
try:
bg = b / g
except:
ac = 0发布于 2013-04-18 07:19:15
编写一个函数来执行此操作,使用lambda (单行函数)在其中一个变量不存在的情况下延迟变量的计算:
def call_with_default(func, default):
try:
return func()
except NameError: # for names that don't exist
return default
ab = call_with_default(lambda: a+b, 0)
# etc.使用某种类型的数据结构(例如列表或字典)来包含值而不是将它们存储在单个变量中可能会带来好处;然后您可以使用循环来执行所有这些计算,而不是单独编写它们。
发布于 2013-04-18 08:04:49
如果你有一堆甚至没有定义的变量,你可能并没有真正的一堆变量。
例如,如果您正在尝试构建一个交互式解释器,用户可以在其中创建新变量,则不要尝试将每个用户变量保存为具有相同名称的全局变量(如果除了安全之外没有其他原因-如果用户尝试创建一个名为main的变量并删除您的main函数,会发生什么?)。存储用户变量的字典。
一旦你这样做了,Alexey和kindall建议的解决方案就会奏效:
def add_default(first, second, default):
try:
return variables[first] + variables[second]
except KeyError:
return default
variables['ab'] = add_default('a', 'b', 0)如果你确实需要在同一级别混合你的代码和用户代码,你可以这样做,通过使用globals()本身作为你的字典:
def add_default(first, second, default):
try:
return globals()[first] + globals()[second]
except KeyError:
return default
ab = add_default('a', 'b', 0)然而,以这种方式使用globals几乎总是表明您之前犯了一个重大的设计错误,正确的做法是备份,直到您找到那个错误…
与此同时,来自一条评论:
我创建一个所有变量的列表,如果它们有赋值或没有赋值,就遍历它们。如果它们没有,我会将它们设置为浮动(‘nan’)。
没有办法创建变量列表(当然,除了通过在globals()中通过名称引用它们之外)。您可以创建一个值列表,但这对您没有任何好处,因为没有针对未定义变量的值。
这是另一个迹象,表明您可能需要的不是一堆独立的变量,而是一本字典。
特别是,您可能需要一个defaultdict
variables = collections.defaultdict(lambda: float('nan'))发布于 2013-04-18 07:31:14
对于更一般的情况,您可以使用lambdas (尽管不是很优雅的解决方案):
def lambda_default(func, default, *args):
try:
return func(*args)
except:
return default
abc = lambda_default(lambda x, y: x + y * z, 0, a, b, c)如果您有一些常用的函数,当然可以将它们封装到另一个def中:
def add_default(first, second, default):
return lambda_default(operator.add, 0, first, second)
ab = add_default(a, b, 0)https://stackoverflow.com/questions/16071885
复制相似问题