Skip to main content
 首页 » 编程设计

python 模块变量作为 function_default 不可变

2025年05月04日10del

我需要通过更改名为 process.py 的应用程序模块头部的默认值来对 python 模块进行单元测试。声明的默认值是一个固定的 int。我可以将其更改为使用 os.environ 中的其他内容,但我希望简单地分配全局,但显然我缺少对“def”的一些理解。

process.default_timeout_secs = 2 
 
# --name: process 
 
default_timeout_secs = 120 
 
def call_process(cmd, timeout=default_timeout_secs): 
    print 'run:', cmd, 'timeout:', timeout 
    ... 
 
 
 
# --name: test_process 
from nose.tools import * 
import process 
 
@ raises(TimeoutExpired) 
def test_process_run_modified_default(): 
    process.default_timeout_secs = 5 
    run(sleep 10) 

我从其他帖子了解到,导入模块时 default_timeout_secs 的 process.call_process.func_defaults 值不是模块顶部的值。如何更改函数中使用的默认值?

process.default_timeout_secs = 5 process.call_process.func_globals['default_timeout'] 5 process.call_process.func_defaults (120)

Out[21]: 5 
>>> process.call_process(cmd) 
 
Out[22]: call_process: cmd= sleep 2 timeout= 120       <----- 120?  
         Executing cmd sleep 2 verbose=True 

输出应该显示异常 TimoutExpired。

请您参考如下方法:

函数默认值在定义时计算,而不是调用时(参见 "Least Astonishment" and the Mutable Default Argument)。

访问和修改函数默认值的唯一方法是 through its __defaults__ property (旧版本中的 func_defaults):

>>> def f(a=5): 
...     return a 
>>> f.__defaults__ 
(5,) 
>>> f.__defaults__ = (99,) 
>>> f() 
99 

请注意,__defaults__ 是一个元组,因此您不能单独分配其成员,但您可以将其作为一个整体分配。