You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何修改函数,实现无需调用时加**的字典传参?

解决方案

直接在函数内部返回**{'a1':4, 'a2':5}属于语法错误,因为**仅能用于函数调用时的参数解包,不能作为返回值使用。要实现仅修改my_dict函数、保持foo(my_dict())调用语句不变的需求,可以通过**猴子补丁(Monkey Patch)**替换原foo函数,让它支持接收字典参数并自动解包。

实现代码

import sys

# 以下为第三方代码,无法修改
def foo(a1, a2):
    print(a1, a2)

# 仅修改这个my_dict函数
def my_dict():
    # 获取foo所在的模块(如果foo来自第三方模块,替换为对应模块名,如sys.modules['thirdparty'])
    module = sys.modules[__name__]
    original_foo = getattr(module, 'foo')

    # 仅执行一次补丁,避免重复替换
    if not hasattr(original_foo, '_is_patched'):
        def patched_foo(*args, **kwargs):
            # 兼容两种调用场景:接收字典参数(来自my_dict)或正常的位置/关键字参数
            if len(args) == 1 and isinstance(args[0], dict) and not kwargs:
                original_foo(**args[0])
            else:
                original_foo(*args, **kwargs)
        
        # 标记已修补,防止重复操作
        patched_foo._is_patched = True
        setattr(module, 'foo', patched_foo)
    
    return {'a1': 4, 'a2': 5}

# 第三方调用语句,无法修改
foo(my_dict())

原理说明

  1. 在my_dict函数内部,先获取原foo函数的引用。
  2. 创建补丁函数patched_foo:如果传入单个字典参数,则解包后调用原foo;否则按原逻辑处理正常的位置/关键字参数,确保不影响其他场景的调用。
  3. 将补丁函数替换原模块中的foo函数,仅执行一次替换避免重复操作。
  4. my_dict返回目标字典,此时调用foo(my_dict())会触发补丁函数的逻辑,自动解包字典完成参数传递。

内容的提问来源于stack exchange,提问作者Ars ML

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:44:54