簡體   English   中英

裝飾一個Python3函數來忽略(a,b,* args,** kwargs)中的* args?

[英]decorate a Python3 function to ignore *args in (a, b, *args, **kwargs)?

Python 3.3:我可以修飾一個函數來忽略所有與命名參數不匹配的位置參數嗎?

import functools
def ignore_star_args():
    def wrapper(function_):
        @functools.wraps(function_)
        def wrapped(*f_args):
            return function_(/*only named args*/)
        return wrapped
    return wrapper

@ignore_star_args()
def list_args(a, b, *args):
    # two positional arguments
    return [a, b] + list(args)

>>> list_args(1, 2, "non-positional arg")
[1, 2]

我認為您誤會了所使用的術語。

參數是傳遞給函數調用的值。 位置參數是沒有關鍵字的參數。

參數函數定義中的名稱。 有三種不同的位置參數; 總的來說,它們是包括*參數或裸* (如果有的話)的那些。

例如,在此代碼中:

def foo(a, b, c=3, d=4, *args, e, f=6, **kw): pass

foo(1, 2, d=3, c=4, e=5, g=7)

abcd都是位置或關鍵字參數 ; args是一個變量位置參數 ; ef僅限關鍵字的參數 ; kw是一個var-keyword參數 (沒有僅位置參數的示例,因為它們不能出現在函數定義中;您必須編寫C / Java / .NET / RPython /任何擴展代碼,或手動創建code對象才能獲得它們。)

在通話中, 12位置參數 345 ,和7關鍵字參數 ; dceg關鍵字標識符

Python將兩個位置參數與前兩個僅位置或位置或關鍵字參數相匹配,或者如果沒有足夠的話,則與var-positional參數相匹配,然后將關鍵字參數與位置或關鍵字或key-only參數,具有相同的名稱,如果找不到名稱,則返回var-keyword參數。 因此,在foo內部:

a, b, c, d, args, e, f, kw = 1, 2, 4, 3, (), 5, 6, {'g': 7}

既然您已經掌握了所有這些內容,那么讓我有些困惑:偶爾,Python使用不同的術語,“形式參數”代替“參數”,“實際參數”代替“參數”。 您大多只能在源代碼的最古老部分找到這一點,但偶爾會出現更高的泡沫。


那么,你要求什么忽略非位置參數。 換句話說,您要接受但忽略關鍵字參數。 這很簡單:只需使用var-keyword參數接受它們,並且不要通過它們:

def wrapped(*args, **kwargs):
    return function_(*f_args)

但是,我認為你要求的是如何忽略所有與位置或位置或關鍵字參數不匹配的參數,位置或關鍵字。

為此,您需要檢查包裝函數的簽名。

很難找到不同類型的成員的確切參考,並且當您這樣做時也很難理解……但是幸運的是, inspect文檔將所有這些信息匯總到了方便的圖表中。

您會看到一個函數沒有看起來像其參數簽名的任何東西……但是它包含一個代碼對象,它具有 當然,當Python僅具有2種參數時,代碼對象是經過重新設計的,它們被稱為“形式參數”而不是“參數”,因此,您在這里想要的只是co_argcount可能不是很明顯-但請相信我,它是。

所以:

def wrapped(*args):
    return function_(*(args[:function_.__code__.co_argcount]))

根據您想對關鍵字參數進行的操作(記住,這些參數可能與命名的position-or-keyword或僅positional的參數匹配!),您可能還想對**kwco_varnames進行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM