将带有默认参数的元组传递给Python中的函数



我必须通过从一个巨大的元组列表中传递预定义的参数来调用一个函数。

所有函数参数都是默认类型,它们根据CATEGORY参数更改长度和类型(请参阅下面的示例代码,以更好地理解我想说的内容(。

LIST_ALL_BETA = [1, 2, 3, 4, 5, 7, 23, 28, 29] # huge list with numbers, all integers
LIST_ALL_FREQ = [1.23, 1.30, 1.35, 2.18, 2.57] # huge list of floats
def MyFunction(idx=None, CATEGORY=None, LOW_LIMIT=None, HIGH_LIMIT=None, ALL_BETA=None, ALL_FREQ=None, NONE=None, LAST_X=None, LST=None):
if CATEGORY=="COUNTED":
partial_COUNTED_lst = globals()[f'LIST_COUNTED_LAST_{LAST_X}']
return [x for x in range(1, 81) if partial_COUNTED_lst[idx][x-1] is not None if LOW_LIMIT <= partial_COUNTED_lst[idx][x-1] <= HIGH_LIMIT]
elif CATEGORY=="BETA":
if ALL_BETA==True:
if NONE == "ignored":
all_BETA_lst = LIST_ALL_BETA
return [x for x in range(1, 81) if all_BETA_lst[idx][x-1] is not None if LOW_LIMIT <= all_BETA_lst[idx][x-1] <= HIGH_LIMIT]
else: # NONE = 0
all_BETA_lst = LIST_ALL_BETA
return [x for x in range(1, 81) if LOW_LIMIT <= [y if y is not None else 0 for y in all_BETA_lst[idx]][x-1] <= HIGH_LIMIT]
else:
if NONE == "ignored":
all_BETA_lst = globals()[f'LIST_BETA_LAST_{LAST_X}']
return [x for x in range(1, 81) if all_BETA_lst[idx][x-1] is not None if LOW_LIMIT <= all_BETA_lst[idx][x-1] <= HIGH_LIMIT]
else: # NONE = 0
all_BETA_lst = globals()[f'LIST_BETA_LAST_{LAST_X}']
return [x for x in range(1, 81) if LOW_LIMIT <= [y if y is not None else 0 for y in all_BETA_lst[idx]][x-1] <= HIGH_LIMIT]
elif CATEGORY=="FREQUENCY":
if ALL_FREQ==True:
all_frequency_lst = LIST_ALL_FREQ
return  [x for x in range(1, 81) if all_frequency_lst[idx][x-1] is not None if LOW_LIMIT <= all_frequency_lst[idx][x-1] <= HIGH_LIMIT]
else:
all_frequency_lst = globals()[f'LIST_FREQ_LAST_{LAST_X}']
return  [x for x in range(1, 81) if all_frequency_lst[idx][x-1] is not None if LOW_LIMIT <= all_frequency_lst[idx][x-1] <= HIGH_LIMIT]
elif CATEGORY=="CMB4":
return LST[idx]
# huge list of parameters:
parametters = [
(idx=23, CATEGORY="COUNTED", LOW_LIMIT=265, HIGH_LIMIT=269, LAST_X=1000),
(idx=23, CATEGORY="COUNTED", LOW_LIMIT=241, HIGH_LIMIT=272, LAST_X=1000),
(idx=23, CATEGORY="COUNTED", LOW_LIMIT=16, HIGH_LIMIT=19, LAST_X=100),
(idx=23, CATEGORY="BETA", LOW_LIMIT=1.55, HIGH_LIMIT=2.01, ALL_BETA=True, NONE="ignored", LAST_X=0),
(idx=23, CATEGORY="BETA", LOW_LIMIT=1.55, HIGH_LIMIT=2.01, ALL_BETA=True, NONE="0", LAST_X=0),
(idx=23, CATEGORY="BETA", LOW_LIMIT=0.0, HIGH_LIMIT=5.3, ALL_BETA=True, NONE="ignored", LAST_X=0),
(idx=23, CATEGORY="FREQUENCY", LOW_LIMIT=0.2587, HIGH_LIMIT=0.2608, ALL_FREQ=True, LAST_X=0),
(idx=23, CATEGORY="FREQUENCY", LOW_LIMIT=0.2478, HIGH_LIMIT=0.2607, ALL_FREQ=True, LAST_X=0),
(idx=23, CATEGORY="FREQUENCY", LOW_LIMIT=0.259, HIGH_LIMIT=0.261, ALL_FREQ=True, LAST_X=0),
(idx=23, CATEGORY="CMB4", LST = LIST_CMB4_LAST_1000_1),
(idx=23, CATEGORY="CMB4", LST = LIST_CMB4_LAST_1000_2)
]

问题是我不能创建这种元组,因为它会给我抛出一个"元组";无效语法错误">

你知道怎么做吗?

提前谢谢!

附言:我也发现这个话题在某种程度上是关于同一个问题的,但它对我没有帮助,因为问题不同,我并不真正理解所涉及的情况,所以我可以使用我所问的这个问题的解决方案。

与其尝试使用元组进行调用,不如使用dict列表并使用字典拆包。如果在dict之前添加**,并将其传递给函数调用,它将把键值对解压到函数的命名参数中。

以下是您的新参数列表:

parameters = [
{"idx": 23, "CATEGORY": "COUNTED", "LOW_LIMIT": 265, "HIGH_LIMIT": 269, "LAST_X": 1000},
{"idx": 23, "CATEGORY": "COUNTED", "LOW_LIMIT": 241, "HIGH_LIMIT": 272, "LAST_X": 1000},
{"idx": 23, "CATEGORY": "COUNTED", "LOW_LIMIT": 16, "HIGH_LIMIT": 19, "LAST_X": 100},
{"idx": 23, "CATEGORY": "BETA", "LOW_LIMIT": 1.55, "HIGH_LIMIT": 2.01, "ALL_BETA": True, "NONE": "ignored", "LAST_X": 0},
{"idx": 23, "CATEGORY": "BETA", "LOW_LIMIT": 1.55, "HIGH_LIMIT": 2.01, "ALL_BETA": True, "NONE": "0", "LAST_X": 0},
{"idx": 23, "CATEGORY": "BETA", "LOW_LIMIT": 0.0, "HIGH_LIMIT": 5.3, "ALL_BETA": True, "NONE": "ignored", "LAST_X": 0},
{"idx": 23, "CATEGORY": "FREQUENCY", "LOW_LIMIT": 0.2587, "HIGH_LIMIT": 0.2608, "ALL_FREQ": True, "LAST_X": 0},
{"idx": 23, "CATEGORY": "FREQUENCY", "LOW_LIMIT": 0.2478, "HIGH_LIMIT": 0.2607, "ALL_FREQ": True, "LAST_X": 0},
{"idx": 23, "CATEGORY": "FREQUENCY", "LOW_LIMIT": 0.259, "HIGH_LIMIT": 0.261, "ALL_FREQ": True, "LAST_X": 0},
{"idx": 23, "CATEGORY": "CMB4", "LST": LIST_CMB4_LAST_1000_1},
{"idx": 23, "CATEGORY": "CMB4", "LST": LIST_CMB4_LAST_1000_2}
]

下面是如何调用函数:

for parameter_dict in parameters:
MyFunction(**parameter_dict)

1个额外的反馈项目:你应该为每个类别创建一个单独的函数。试图将所有这些都塞进一个函数中会很难维护,而且令人困惑。也许可以创建一个process_countedprocess_betaprocess_frequencyprocess_cmb4函数。然后,您可以在某个地方拥有一些控制逻辑,根据每个类别调用单独的函数。

最新更新