簡體   English   中英

功能不承認args和kwargs

[英]function not recognizing args and kwargs

我試圖定義一個這樣的函數:

def get_event_stats(elengths, einds, *args, **kwargs):

    master_list = []

    if avg:
        for arg in args:
             do stuff...
    if tot:
        for arg in args:
             do stuff...

    return master_list

我希望elengths和einds是固定的位置args(這些只是int的數組)。 我試圖通過傳遞一個可變長度的數組列表作為* args和一些** kwargs來使用該函數,在這個例子中是兩個(avg和tot),但可能更多,例如,

avg_event_time = get_event_stats(event_lengths, eventInds, *alist, avg=True, tot=False)

哪里

alist = [time, counts]

我的kwargs是avg和tot,它們的值分別為True和False。 無論我如何嘗試實現此功能,我都會遇到某種錯誤。 在正確使用* args和** kwargs時我在這里錯過了什么?

如果你的意思是avgtot應該作為關鍵字args傳入,比如你的例子get_event_stats(..., avg=True, tot=False)那么它們就會填入kwargs 您可以使用鍵查找在kwargs dict中查找它們(如kwargs['avg']

但是如果它們根本不存在,則會產生一個關鍵錯誤,所以將它與dict.get()方法一起使用: kwargs.get('avg')如果不存在則返回None ,這是boolean False 或者使用kwargs.get('avg', False)如果你明確地想要一個False如果它不存在的話。

def get_event_stats(elengths, einds, *args, **kwargs):

    master_list = []

    if kwargs.get('avg'):
        for arg in args:
             do stuff...
    if kwargs.get('tot'):
        for arg in args:
             do stuff...

    return master_list

**kwargs創建一個dict ,它不會將任意名稱注入到本地名稱空間中。 如果你想查找特定關鍵字是否被傳遞,你無法測試if avg:沒有名為avg變量),你需要檢查avg是否在dict ,例如, if 'avg' in kwargs:或者檢查存在性和“真實性”,所以傳遞avg=False相當於根本不傳遞它,測試if kwargs.get('avg'):使用kwargs.get('avg')確保沒有拋出異常如果avg沒有通過,不像if kwargs['avg']:

注意:如果可能的話,你應該真正轉向Python 3。 它使得編寫這個函數變得更加明顯和干凈,因為你可以完全避免使用kwargs ,並且通過將函數定義為:來驗證沒有傳遞無法識別的關鍵字參數:

def get_event_stats(elengths, einds, *args, avg=False, tot=False):
    master_list = []

    if avg:
        for arg in args:
             do stuff...
    if tot:
        for arg in args:
             do stuff...

    return master_list

請注意,如果在位置變量之后明確命名關鍵字參數,那么您已經編寫的函數的主體如何工作而不進行修改,使您的代碼更加自我記錄(以及更高效,並且具有更好的自我檢查;干凈的Py3如果你將avrg=True傳遞給它,代碼將錯誤地通知你無法識別的參數,而**kwargs方法需要顯式檢查未知參數,這會減慢你的速度並使代碼膨脹。

最接近Py3錯誤檢查的最小開銷和類似的正確性/可讀性將是:

def get_event_stats(elengths, einds, *args, **kwargs):
    master_list = []
    # Unpack the recognized arguments (with default values), so kwargs left should be empty
    avg = kwargs.pop('avg', False)
    tot = kwargs.pop('tot', False)

    # If any keywords left over, they're unrecognized, raise an error
    if kwargs:
        # Arbitrarily select alphabetically first unknown keyword arg
        raise TypeError('get_event_stats() got an unexpected keyword argument {!r}'.format(min(kwargs)))

    if avg:
        for arg in args:
             do stuff...
    if tot:
        for arg in args:
             do stuff...

    return master_list

暫無
暫無

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

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