Python 将函数参数设置为全局变量

Python 将函数参数设置为全局变量,python,function,Python,Function,我试图简单地使函数接收到的参数对文件中的所有其他函数都是可访问的,或者设置为全局变量,而不必将其作为所有其他函数的参数传递。到目前为止,我试图将其设置为全局变量,但显然不能将参数设置为全局变量 下面是我想要的一个简单示例: def add(a,b, verbose): global verbose return a + b result = add(2,3, False) print(verbose) 在我的例子中,被调用的函数位于另一个文件上,因此不能预先将verbose设

我试图简单地使函数接收到的参数对文件中的所有其他函数都是可访问的,或者设置为全局变量,而不必将其作为所有其他函数的参数传递。到目前为止,我试图将其设置为全局变量,但显然不能将参数设置为全局变量

下面是我想要的一个简单示例:

def add(a,b, verbose):
    global verbose
    return a + b

result = add(2,3, False)
print(verbose)

在我的例子中,被调用的函数位于另一个文件上,因此不能预先将verbose设置为全局函数。任何帮助都将不胜感激

如果要分配给函数中的全局
verbose
变量,可以执行以下操作:

def add(a,b, verbose_value):
    global verbose
    verbose = verbose_value
    return a + b

result = add(2,3, False)
print(verbose)

如果要分配给函数中的全局
verbose
变量,可以执行以下操作:

def add(a,b, verbose_value):
    global verbose
    verbose = verbose_value
    return a + b

result = add(2,3, False)
print(verbose)

第一点,作为一般规则,全局变量是邪恶的-或者更准确地说,应该尽可能避免从函数中变异或更糟糕地重新绑定全局变量

第二点:在Python中,“global”实际上意味着“模块级”——没有“流程级”global(注意,这是一个基于上面第一点设计的选择)

第三点:对于您的通用用例(应用程序设置),“不那么邪恶”的方法是让您的所有模块使用设置系统,因此,您的模块只需导入设置并从中读取参数值,而不是“将参数传递给将其设置为全局的函数,这样您就不需要传递参数”(以django设置为例)

缺点是1/只有您自己的代码可以使用这些设置,2/它使您的代码依赖于这些设置(有时可能是PITA)


最后,给定“verbose”名称,我假设您希望配置程序调试/错误输出的详细级别。以标准、可移植和良好解耦的方式(这将修复此功能的上述两个缺点)进行配置的正确方法是。此包旨在解耦记录器的使用(在“库”代码中,使用日志配置(特定于应用程序/安装)中的
logger.log(level,msg,…)
或其快捷方式之一)首先,它需要一点学习,但从经验来看,它花费的时间很长,而且实际上可以很快节省时间。

第一点,作为一般规则,全局变量是邪恶的-或者更准确地说,应该尽可能避免从函数中变异或更糟糕地重新绑定全局变量

第二点:在Python中,“global”实际上意味着“模块级”——没有“流程级”global(注意,这是一个基于上面第一点设计的选择)

第三点:对于您的通用用例(应用程序设置),“不那么邪恶”的方法是让您的所有模块使用设置系统,因此,您的模块只需导入设置并从中读取参数值,而不是“将参数传递给将其设置为全局的函数,这样您就不需要传递参数”(以django设置为例)

缺点是1/只有您自己的代码可以使用这些设置,2/它使您的代码依赖于这些设置(有时可能是PITA)


最后,给定“verbose”名称,我假设您希望配置程序调试/错误输出的详细级别。以标准、可移植和良好解耦的方式(这将修复此功能的上述两个缺点)进行配置的正确方法是。此包旨在解耦记录器的使用(在“库”代码中,使用日志配置(特定于应用程序/安装)中的
logger.log(level,msg,…)
或其快捷方式之一)。一开始需要一点学习,但从经验来看,时间花得很好,而且实际上很快就节省了时间。

使用decorators!!!@Mium您认为这里涉及到进程/线程的原因是什么?OP也没有提到。@Akshay Nevrekar如何使用decorators实现这一点?使用decorators!!!@Mium您认为进程/线程是什么我们在这里参与了吗?OP也没有提到。@Akshay Nevrekar如何使用decorator完成这项工作?这只会影响当前模块的名称空间,实际上是一个非常糟糕的解决方案。@Brunodesshuilliers是的,这对我的情况来说已经足够了,但是,因为我在这个模块中只需要这个变量这只会影响当前模块的名称速度,实际上是一个非常糟糕的解决方案。@Brunodesshuilliers是的,这对我的情况来说是足够的,但是,因为我只需要这个模块中的这个变量。KS@bruno真相是我真的想要一个简单的解决方案。正如你所说,这个想法是控制一个已经定义的模型的详细程度,这个模型中已经有很多打印。W我最后要做的是使用接收到的verbose参数,定义一个函数“verboseprints”,该函数输出其参数或不依赖于此verbose参数,并将此函数设置为全局函数。然后将所有输出替换为“verboseprints”。可能不是一个很好的解决方案,但对于这种情况来说,这是一个简单实用的解决方案。无论如何,感谢您建议使用日志软件包。感谢@bruno truth,我真的需要一个简单的解决方案。正如您所说,这个想法是控制一个已经定义的模型的详细程度,该模型中已经有许多打印。我最终的目标是使用e收到verbose参数,定义一个函数“verboseprints”,它打印其参数或不依赖于此verbose参数,并将此函数设置为全局。然后用“verboseprints”替换所有打印。对于这种情况,这可能不是一个很好的解决方案,但简单实用。无论如何,感谢您建议使用日志记录包。