【问题标题】:How to ignore undefined variables passed to the print function?如何忽略传递给打印函数的未定义变量?
【发布时间】:2018-07-30 01:52:54
【问题描述】:

我有以下代码:

help1 = 14
help2 = "nice"
help3 = "gate"

try:
    print('''
    help1 %d
    help2 %s
    help3 %s
    help4 %s
    ''' % (help1, help2, help3, help4))
except (NameError):
    print("")

我希望我的print 引用多个变量,其中一些变量没有定义(例如help4)。如何修改打印语句以跳过任何未定义的变量?我尝试了 nameError 异常 - 但无法让它工作。

【问题讨论】:

  • 请详细说明“无法正常工作”的含义。
  • 为什么要这样做?这闻起来很像XY problem,无论您实际尝试做什么,都可能有更好的答案。

标签: python


【解决方案1】:

您甚至无法访问此处的print。您不能引用未定义的变量。这样做会引发NameError。因此,您甚至可以在创建四个值的元组之前到达NameError

(好吧,我想你可以用 10 个 except NameError: 块链来做一些可怕的事情,这些块会遍历所有可能的错误排列,但是...... eww......)

如果你真的需要做这样的事情,你必须手动在你认为它们应该位于的任何命名空间中间接查找名称。例如,如果这段代码在一个函数中,并且所有四个变量都应该是本地人,您可以在本地命名空间中按名称查找它们:

[locals().get(name, 'not found') for name in ('help1', 'help2', 'help3', 'help4')]

对于全局变量或任何其他命名空间也是如此。

但这几乎肯定是个坏主意。您可能应该这样做:

  • 将默认值分配给函数/模块/其他顶部的所有这些变量,因此它们不是未定义的变量。
  • 将这些值放在一个列表或字典中,而不是放在一堆可能存在也可能不存在的单独变量中。 (请注意,hacky 解决方案意味着您已经在有效地执行此操作,只是您将字典藏起来不让自己看到。)
  • 更仔细地跟踪状态,以便了解在任何给定点可以使用哪些变量。

【讨论】:

    【解决方案2】:

    如果你想检查一个var是否存在,你可以这样做

    if "var_name" in locals():#or globals()
         print(var_name)
    

    但这通常不是一个好方法。

    【讨论】:

    • 更好的方法是使用try/except 来确定是否可以毫无例外地引用var_name..
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多