如何忽略传递给打印函数的未定义变量?

时间:2018-07-30 01:52:54

标签: python

我有以下代码:

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异常-但无法使其正常工作。

2 个答案:

答案 0 :(得分:1)

您甚至都没有到达print。您不能引用未定义的变量。这样做会引发NameError。因此,您甚至可以在创建四个值的元组之前进入NameError

(好吧,我想您可以通过10个except NameError:块链来做一些可怕的事情,这些块经历了所有可能的错误排列,但是…eww…)

如果您确实需要执行以下操作,则必须手动在您认为应位于的命名空间中间接查找名称。例如,如果此代码位于函数内部,并且所有四个变量都应如果是本地人,则可以在本地名称空间中按名称查找它们:

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

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

但这几乎肯定是一个坏主意。您可能应该在做类似的事情:

  • 将所有这些变量的默认值分配给函数/模块/顶部的所有变量,因此它们不是未定义的变量。
  • 将这些值放在列表或字典中,而不是一堆可能存在或不存在的独立变量中。 (请注意,该骇人听闻的解决方案意味着您已经有效地做到了这一点,只是您将字典隐藏在远离自己的地方。)
  • 更仔细地跟踪状态,以便您知道可以在任何给定时间使用哪些变量。

答案 1 :(得分:-1)

如果要检查变量是否存在,可以执行

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

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