python - 如何在不使用 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.
解决方案
我认为不能使用是一个奇怪的要求*
,但这是我想出的:
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
您传入的任何内容都将返回一个可迭代对象。
另请注意,我已决定不存在关键字参数。
推荐阅读
- html - div中的CSS背景颜色只有20px高
- unit-testing - 无法使用 i686-linux-android 目标运行单元测试
- c++ - Libcurl Returns Corrupt Data
- c++ - 创造雨滴
- angular - 为什么我不能得到身体形式 Angular
- owl - 使用 OWL API 将类子层次结构合并到另一个本体
- python - 在条件下在数据框中添加一行
- java - 如何在读取 csv 文件时跳过重复的行?
- spring - Spring WebClient Hystrix 或 Resilience4j 还是什么都没有?
- wordpress - 如何使 WordPress Bootstrap 父菜单在桌面上可点击而在移动视图中不可点击?