簡體   English   中英

如何在python的用戶定義函數中實現“僅位置參數”?

[英]How to implement "positional-only parameter" in a user defined function in python?

如何為用戶在 python 中定義的函數實現“僅位置參數”?

def fun(a, b, /):
    print(a**b)

fun(5,2)        # 25
fun(a=5, b=2)   # should show error

在 Python 3.8 之前, /語法只是文檔性的。 3.8開始,您可以使用它在函數定義中指定僅位置參數。 例子:

def pow(x, y, z=None, /):
    r = x**y
    if z is not None:
        r %= z
    return r

現在pow(2, 10)pow(2, 10, 17)是有效的調用,但是pow(x=2, y=10)pow(2, 10, z=17)是無效的。

有關更多詳細信息,請參閱PEP 570

更新:這個答案會越來越過時; 請參閱https://stackoverflow.com/a/56149093/1126841


唯一的解決方案是使用*參數,如下所示:

def fun(*args):
    print(args[0] ** args[1])

但這有其自身的問題:您不能保證調用者將提供恰好兩個參數; 您的函數必須准備好處理 0 或 1 個參數。 (忽略額外的參數很容易,所以我不會詳細說明這一點。)

在接受PEP 570之后,python 3.8 中添加了僅位置參數功能,然后在函數簽名的文檔中找到它以指示函數不接受任何關鍵字參數。

函數定義之前的參數在正斜杠 (/) 之前只是位置參數,斜杠 (/) 后面的參數可以是任何類型的語法。 其中參數僅根據調用函數時的位置映射到僅位置參數。 通過關鍵字(名稱)傳遞僅位置參數無效。

以下示例顯示僅具有位置參數的函數定義

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)

在上面的函數定義中,參數 a 和 b 必須作為僅位置參數傳遞,而 x 或 y 可以是位置參數或關鍵字。

以下函數調用有效

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

以下函數調用將引發異常 TypeError,因為 a 和 be 作為關鍵字參數傳遞。

foo(a=1.45, b=3.14, x=1, y=4)

類型錯誤:foo() 得到了一些作為關鍵字參數傳遞的僅位置參數:'a, b'

通過在函數定義中添加正斜杠 (/) 作為最后一個參數,可以將函數定義為僅接受位置參數。

def pow(x, y, /):
   return x ** y

在上面的函數定義中,所有參數(x 和 y)都是位置參數。 在這里,按名稱傳遞參數無效,這將導致 TypeError。

pow(2, 3); pow(3, 9) pow(2, 3); pow(3, 9)有效而pow(x=3, y=9)無效,這將引發 TypeError

Python Positional Only Parameters 中閱讀有關函數參數和僅位置參數類型的更多信息

暫無
暫無

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

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