避免阴影变量的pythonic方法是什么



我经常有以下代码,它要么导致变量阴影,要么导致局部变量的乘法

def whenadult(age):
    return 18 - age
age = 5
needtowait = whenadult(age)

age传递给函数时与在主代码中具有相同的逻辑角色,因此我想避免在 whenadult 中创建类似 l_age 的东西。

解决"阴影与变量乘法"困境的pythonic方法是什么?

更新:跟进一些评论,我想明确表示我正在寻找 Python 最佳实践(而不是局部与全局变量范围)

局部变量(和函数参数)age恰好与程序中其他地方的变量同名这一事实无关紧要。局部变量的全部意义在于它们只存在于定义它们的函数的局部范围内。

局部变量与

其他地方用作参数的变量具有相同的名称这一事实尤其不是问题。事实上,这在现实生活中的代码中很常见。例如,选择一个随机的 stdlib 模块,即 cmd 的 3.3 版本,Cmd.onecmd 方法有一个名为 line 的变量,并将其作为参数传递给 self.default 方法,该方法将其绑定到也名为 line 的参数。

如果您

没有同名的局部变量,则用于参数的变量恰好是您可以访问的全局变量,这一事实不是问题,除非您实际上想要访问该全局变量。你不想在现有代码中这样做,而且几乎永远不应该想要。在这种情况下,以及在大多数现实世界的情况下,这只是一个巧合,没有任何意义,也没有任何影响,而不是你必须解决的问题。


您遇到的问题是 PyCharm 无法猜测您是否希望全局age可以在whenadult中访问。是否有可能(如果不是在这种微不足道的情况下,也许在更复杂的情况下)一个人可能会同样感到困惑,从而减慢他对代码的理解?或者有一天你将不得不在某个环境中编写代码,你的代码审阅者或老师或其他任何东西会拒绝你的代码,因为它没有通过一些没有警告的 linter?或。

但实际上,在任何这样的环境中,他们可能会首先抱怨你使用全局变量。你真的不需要在这里。age是全局的唯一原因是它必须可供顶级代码访问。如果将该代码移动到函数中,age可以成为该函数中的本地代码。例如:

def whenadult(age):
    return 18 - age
def main():
    age = 5
    needtowait = whenadult(age)
main() # possibly with an if __name__ == '__main__' guard

这将使PyCharm,以及任何linter工具以及任何容易混淆或思想僵化的人类读者感到高兴。它甚至可以使您的代码更快一点。另一方面,要阅读的代码更多——只有三行和一个缩进,但整个程序只有八行长。因此,您可以根据具体情况进行权衡。

每当我在 PyCharm 中收到阴影变量的警告时。我会尝试重命名局部变量以使用下划线前缀作为约定。这是除了将全局变量包装到 main() 函数之外的另一种考虑方式。

    def whenadult(_age):
        return 18 - _age
    age = 5
    needtowait = whenadult(age)

PyCharm 会竭尽全力防止您意外访问(通常是由于拼写错误)外部范围内的变量,因为这样做会产生非常讨厌的错误

简答:
大多数可执行文件不需要访问全局状态,因此请遵循使main成为 python 函数的结构:

def helper_function():
  # a function that will be used by main()
.
.
.
def main():
  # make MAIN a function.
  helper_function() 
if __name__ == '__main__':
  main() 
  # DONT define any variables here in this GLOBAL scope

最新更新