正确使用函数调用作为默认参数

Correct usage of function calls as a default parameter

在尝试优化我当前的代码时,我遇到了这种情况,我的函数默认获取当前时间,并且它是使用非常基本但不优雅的方式完成的:

from datetime import datetime
.
.
.
def generateGraph(self, fromTime, toTime = None):
    if toTime is None:
        toTime = datetime.now()
    .
    .

因此,我开始测试这样的东西:

def generateGraph(self, fromTime, toTime = datetime.now()):
    .
    .

但是,由于我的应用程序有点大(以及具体测试这个应用程序的难度),我制作了一个简短的代码片段进行测试,如下:

X = 20

def setValue():
    return X
def myFunction(value=setValue()):
    print(value)
    
a = myFunction()
X = 15
b = myFunction()

我预计输出是: 20 15

但是,我得到的输出是: 20 20

这个值是在函数声明时赋值的吗?还是在读取“def”语句时赋值?我不太清楚这会如何影响我的应用程序,以及如何在这个示例代码片段中实现我正在寻找的东西(因为我使用 X 只是作为 datetime.now() 的替代品,因为 simplicity/visibility清酒).

您希望遵循将其设置为 None 的模式,然后在未设置的情况下填充该值。函数定义参数中的值只会被计算一次,所以你不能也不应该假设以这种方式更新默认参数:

def myFunction(value=None):
    if value is None:
        value = setValue()
    print(value)