首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python - summarize -except语句

Python - summarize -except语句
EN

Stack Overflow用户
提问于 2013-04-18 07:17:41
回答 3查看 502关注 0票数 2

我想总结一下下面的代码。它应该做的是检查计算中的变量是否被赋值。如果不是,则结果将为零。因为我有成百上千个这样的计算,所以我不想重复尝试--除了每个计算。

我怎么能这么做呢?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2013-04-18 07:19:15

编写一个函数来执行此操作,使用lambda (单行函数)在其中一个变量不存在的情况下延迟变量的计算:

代码语言:javascript
复制
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.

使用某种类型的数据结构(例如列表或字典)来包含值而不是将它们存储在单个变量中可能会带来好处;然后您可以使用循环来执行所有这些计算,而不是单独编写它们。

票数 5
EN

Stack Overflow用户

发布于 2013-04-18 08:04:49

如果你有一堆甚至没有定义的变量,你可能并没有真正的一堆变量。

例如,如果您正在尝试构建一个交互式解释器,用户可以在其中创建新变量,则不要尝试将每个用户变量保存为具有相同名称的全局变量(如果除了安全之外没有其他原因-如果用户尝试创建一个名为main的变量并删除您的main函数,会发生什么?)。存储用户变量的字典。

一旦你这样做了,Alexey和kindall建议的解决方案就会奏效:

代码语言:javascript
复制
def add_default(first, second, default):
    try:
        return variables[first] + variables[second]
    except KeyError:
        return default

    variables['ab'] = add_default('a', 'b', 0)

如果你确实需要在同一级别混合你的代码和用户代码,你可以这样做,通过使用globals()本身作为你的字典:

代码语言:javascript
复制
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

代码语言:javascript
复制
variables = collections.defaultdict(lambda: float('nan'))
票数 3
EN

Stack Overflow用户

发布于 2013-04-18 07:31:14

对于更一般的情况,您可以使用lambdas (尽管不是很优雅的解决方案):

代码语言:javascript
复制
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中:

代码语言:javascript
复制
def add_default(first, second, default):
    return lambda_default(operator.add, 0, first, second)

ab = add_default(a, b, 0)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16071885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档