【问题标题】:Practice on calling an object that may or may not be defined练习调用可能定义或未定义的对象
【发布时间】:2020-01-04 13:28:19
【问题描述】:

以下被认为是不好的做法:

var = var if 'var' in globals() else None    

换句话说,如果有一个定义变量的if 语句,并且我可能需要稍后访问该变量,以使用上述构造,而不是必须将变量定义为Noneif 语句之前。

为什么或为什么不能接受上述结构?

一个例子是这样的:

if process == 'yes':
    # 100 lines of code
    obj = {...}


return Response(obj)

【问题讨论】:

  • 你不会对NameError 使用try/except 吗?无论如何,如果对是否定义了变量存在疑问,我认为这并不是一段好的代码。我希望它们被定义,但其值为None
  • 您能举个例子吗?我想不出你无法捕捉到NameError 而不是这个的情况。
  • 请参阅我的answer 以了解解决此主题的问题。
  • 我真的想不出一个很好的理由,为什么您必须猜测是否定义了变量。究竟是什么用例?对我来说,这是主要的代码异味。
  • "...而不必在 if 语句之前将变量定义为 None。"不过,这不是更清洁、更简单吗?

标签: python python-3.x


【解决方案1】:

是的,这是不好的做法。通过使用 globals() 或除了 NameError。相反,只需定义您将使用的所有变量。永远不需要定义它们。

在你的例子中:

obj = None

if process == 'yes':
    # 100 lines of code
    obj = {...}

#maybe log a warning in case obj is None still. or handle it in the caller
return Response(obj)

【讨论】:

  • 我喜欢在这种情况下记录它的想法。
【解决方案2】:

是的,这是不好的做法。不管它是否实用,它混合了范围,这是令人困惑的。您检查 var 是否在 global 范围内定义,然后从 current 范围内获取其值,无论它是否是全局的。例如:

def func():
    var = 'Local'
    var = var if 'var' in globals() else None
    print(var)

func()  # -> None
var = 'Global'
func()  # -> Local

如果您想始终在 global 范围内查找 var,请使用 dict.get 和默认值:

var = globals().get('var', None)

如果您想始终在 当前 范围内查找 var,请使用 try-except 捕获 NameError,例如在 Reblochon Masqueanswer 中:

try:
    var = var
except NameError:
    var = None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2021-12-01
    • 2021-12-21
    • 1970-01-01
    • 2022-01-20
    • 2020-08-11
    相关资源
    最近更新 更多