python中partial的使用規則

前天看到了partial的一個新用法,記錄一下。

概念

函數聲明如下:

functools.partial(func[,*args][, **keywords])

返回一個可以像函數一樣被調用的partial實例,在調用時使用args和keywords參數。使用python實現時,類似於:

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

通常的使用方法

通常的用法是在原函數聲明的參數中,從前往後連續將參數值固定:

>>> from functools import partial
>>> def test_partial(a, b, c, d):
...     print a,b,c,d
...
>>> test1 = partial(test_partial,1,2)
>>> test1(3,4)
1 2 3 4
>>> test2 = partial(test_partial,1,2,3,4)
>>> test2(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test_partial() takes exactly 4 arguments (5 given)

這通常只能把前面的參數固定,假如有個需求和現有的不一樣,需要使後面的參數固定,該怎麼做?可以使用下面的方法

新的使用方法

1.使用關鍵字參數

>>> test3 = partial(test_partial, d=4)
>>> test3(1,2,3)
1 2 3 4
  1. 其限制
>>> test4 = partial(test_partial, c=3, d=4)
>>> test4(1,2)
1 2 3 4
>>> test5 = partial(test_partial, b=2, d=4)
>>> test5(1,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test_partial() got multiple values for keyword argument 'b'

可以看到,當只對b和d賦值,然後調用時會報錯,關鍵值參數有多個值。我們試試在調用時,使用關鍵字c看看:

>>> test5(1,c=3)
1 2 3 4

可以看出,這樣也可以正常調用。

  1. 如果對前面的參數默認賦值,會出現什麼情況?是不是和以前一樣,只需要使用列表參數就行了?
>>> test6 = partial(test_partial, a=1,b=3)
>>> test6(3,4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test_partial() got multiple values for keyword argument 'a'

顯然不行,最後還是得使用關鍵字參數進行調用。

總結

從上面的運行結果來看,使用partial規則如下:

  1. 將前面連續的參數固定,就可以直接繼續按照原來的參數繼續調用。如

    >>> test1 = partial(test_partial,1,2)
    >>> test1(3,4)
    1 2 3 4
  2. 將後面的連續參數固定,就可以直接繼續使用原來的參數進行調用。如

    >>> test4 = partial(test_partial, c=3, d=4)
    >>> test4(1,2)
    1 2 3 4
  3. 如果默認參數值不是連續的或者是直接對前面的連續參數賦值,那麼就需要使用關鍵字參數進行調用,如

    >>> test5(1,c=3)
    1 2 3 4
    >>> test6(c=3,d=4)
    1 3 3 4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章