首页 > 解决方案 > 如何在不使用 splat 运算符的情况下解压缩具有不同数量元素的元组?

问题描述

这是我大学项目的一部分,我正在尝试创建一个返回多个变量(未打包的元组)的函数,以调用具有适当数量参数的另一个函数。

value = function_list[i](*func())

这很容易使用 *(splat) 运算符,直到我们的一位讲师告诉我们不要使用此运算符。然后,我尝试通过手动将元组分配给变量来解包元组。

a, b = func()
function_list[i](a, b) #Causes error when a function requires more/less than 2 arguments.

Function_list 是可能具有不同数量参数的多个函数定义的列表。所以在某些情况下这是一个问题。这些功能不是我自己制作的,因此我无法将这些参数更改为可选的。

有没有最好的方法来替换 * 运算符以使我的所有功能正常工作?

另外,我不允许使用这些关键字:

as, assert, asynch, await, break, class, continue, except, finally, global, is, lambda, nonlocal, raise, try, with, yield. 

标签: pythonlistfunctionparametersarguments

解决方案


我认为不能使用是一个奇怪的要求*,但这是我想出的:

import inspect, functools

def get_min_max_arg_count(func):
    params = inspect.signature(func).parameters
    defaults = [p.default for p in params.values()]
    return defaults.count(inspect._empty), len(params)

def call_with_params(func, params):
    for param in params:
        func = functools.partial(func, param)
    return func()

def call_matching_func(func, function_list):
    '''Call `func` and the first function in `function_list` that
       has a signature matching the tuple returned by `func`.'''
    params = func()
    n_params = len(params)
    for fn in function_list:
        n_req, n_max = get_min_max_arg_count(fn)
        if n_req <= n_params <= n_max:
            return call_with_params(fn, params)

请注意,call_matching_func假设func您传入的任何内容都将返回一个可迭代对象。

另请注意,我已决定不存在关键字参数。


推荐阅读