我想從函數中獲取一個字典,該字典將函數參數作為鍵,將默認值作為值。我曾經inspect.getfullargspec()獲取參數列表和默認值列表。然后我嘗試使用dict(zip())這些列表創建字典。這有效,但前提是每個參數都有默認值。如果沒有默認值,一切都會變得混亂(正如預期的那樣)。例如,如果參數沒有默認值,我該如何添加 aNone作為值。或者還有其他想法嗎?這是代碼:def fn(name, age=18): passspec = getfullargspec(fn)args = spec.argsdefaults = spec.defaultszipped = dict(zip(args, defaults))
1 回答

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
由于非默認參數必須始終位于左側(因為非默認參數不能位于默認參數之后),因此您可以計算需要多少填充,然后將其添加到默認參數的前面:
def func(a, b=1, c=2, *args, **kwargs):
pass
spec = getfullargspec(func)
padded_defaults = (None,) * (len(spec.args) - len(spec.defaults)) + spec.defaults
zipped = dict(zip(spec.args, padded_defaults)) # {'a': None, 'b': 1, 'c': 2}
(len(spec.args) - len(spec.defaults))計算需要多少左側填充,然后使用“序列乘法”( (None,) *) 生成該填充。+ spec.defaults然后將填充連接到現有默認值的左側。
在某些極端情況下這可能會中斷;雖然我無法立即想到這樣的情況。由于元組串聯,這也不是很有效,但在 99% 的情況下這可能不是問題。
arg->default 之間似乎沒有存儲在任何地方,因此最好的選擇似乎是根據每個參數的數量推斷哪些參數具有哪些默認值。
添加回答
舉報
0/150
提交
取消