Python 在函数中使用全局变量而不将其明确传递给函数时,是否可能收到警告?

Python 在函数中使用全局变量而不将其明确传递给函数时,是否可能收到警告?,python,Python,在python中,如果您定义了一个全局变量,则所有函数都知道该变量,而无需显式传递,您可以这样做,例如: x=1 def func(): return x 我知道这是正常行为,但它也会启用不干净的代码,因为解释器不会告诉您是否忘记将全局变量传递给函数 我通常为数据处理编写脚本,通常所有代码都在一个文件中,因为数据处理是一个线性过程。出于同样的原因,我只使用函数,不使用类。然而,这种设计方法会导致有很多全局变量,有时会忘记将它们显式地传递给函数 当我在函数中使用全局变量而不显式传递它时,

在python中,如果您定义了一个全局变量,则所有函数都知道该变量,而无需显式传递,您可以这样做,例如:

x=1
def func():
    return x
我知道这是正常行为,但它也会启用不干净的代码,因为解释器不会告诉您是否忘记将全局变量传递给函数

我通常为数据处理编写脚本,通常所有代码都在一个文件中,因为数据处理是一个线性过程。出于同样的原因,我只使用函数,不使用类。然而,这种设计方法会导致有很多全局变量,有时会忘记将它们显式地传递给函数

当我在函数中使用全局变量而不显式传递它时,有没有办法让Python抛出警告


我在Spyder 3.7的IPython 7.7.0上使用Python 3.7.4。

不幸的是,没有。在Python中,一切都是一个真正的对象,因此“全局”也包括类、函数和导入的模块

但是,您可以通过以下方式检查函数是否使用全局变量

导入检查,警告
y=5
def f(x):
返回x+y
def warn_me(功能):
如果检查.getclosurevars(func).globals:
warning.warn(f'函数{func.\u_名称\u_}使用全局变量')
警告我(f)
出于调试的目的,您可以创建一个脚本来遍历您的文件、函数和检查

  • 我建议尽量避免使用全局变量。使用它们有一些正当的理由,但总的来说,有更干净的方法来达到同样的效果

  • 如果您遵循最佳实践,您将使用大写字母编写全局变量。这样就很容易在代码中发现全局变量。此外,在您的示例中,一个linting工具(如pylint)会用这样的消息警告您:常量名称“x”不符合大写字母命名样式

  • 如果有很多全局变量/常量,可以将它们全部放在全局dict
    CONFIG={'MARCO':'Polo','ping':'pong',}
    中,并在函数之间传递这个对象


  • 我不这么认为。从技术上讲,职能也是全球性的;如果有一个函数调用了另一个函数(没有作为参数传递),则会触发警告。记住全局变量并不总是一件坏事,这一点很重要。可变全局状态可能会有问题,但只读全局变量通常不会成为问题(取决于您的需要)。不要使用全局变量,如果不将适当的变量传递给函数,您将收到警告!每天都有非常合理的使用案例,因此无法区分你的意思和你的非意思。非常感谢你的建议,您的代码中只有两个错误:模块名为
    warnings
    ,而您在
    func.\uuuu name\uuu
    中漏掉了一个下划线。可能会将其用作装饰器?@sinoroc:取决于您如何使用它。您可以在一个脚本中使用它,它可以更好地遍历代码的所有函数,是的。我一直在考虑这个问题,但正如我所说的,我使用Python进行数据处理,基本上执行一个带有一些配置输入的线性脚本文件。唯一的另一种方法是把所有的东西都放在一节课上,“我一直在想这个,但是”,第1点还是第2点?“做这件事的唯一其他方法是把所有的东西都放在一个类中。”我不确定这会有什么帮助。第1点。通常我有几个配置变量和一个数据源。我读取数据,对其进行处理,然后再次将其写入某个文件。在开发这些例程时,我经常需要检查中间的数据,因此我将dataframe作为全局变量,以便始终在解释器中查看它。主要的线性数据处理总是在主要范围内进行,处理代码只有在完成之后才最终进入函数。我还可以将主线封装在一个函数中,以减少全局变量的数量。