正确使用函数调用作为默认参数
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)
在尝试优化我当前的代码时,我遇到了这种情况,我的函数默认获取当前时间,并且它是使用非常基本但不优雅的方式完成的:
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)