亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用于保留子函數默認參數的 Python 模式

用于保留子函數默認參數的 Python 模式

繁花不似錦 2021-06-14 16:39:57
假設我有一個帶有默認參數的函數和另一個調用它的函數。我想讓調用者覆蓋默認參數或保留它。我陷入了以下模式。這是一個反模式,這是最佳實踐,有沒有更好的方法?def subfunc(x=10):    # do something with xdef callingfunc(x=None):    y= subfunc() if x is None else subfunc(x) # IS THIS AN ANTI PATTERN?
查看完整描述

2 回答

?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

大多數情況下,為此使用可選的 varargs ( *args) 和/或(最好是 imho)可選的關鍵字 args ( **kwargs)。假設callingfunc()還需要一些自己的參數y:


def subfunc(x=10):

    """ Do something with x


    :param x: used to do something (default: 10)

    """

    print("subfunc({})".format(x))


def callfunc(y, **kwargs):

    """ Do something with `y` and calls `subfunc()`


    :param y: something to do something with

    :param kwargs: will be passed to `subfunc()` (cf `subfunc() doc)`

    """ 


    print("callfunc({})".format(y))

    subfunc(**kwargs)



callfunc(42)

callfunc(42, x="bar")

這讓您很容易知道哪些是callfunc()自己的參數,哪些僅用于subfunc(),并且如果subfunc()有多個參數,則比您的解決方案更容易。


查看完整回答
反對 回復 2021-06-22
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

這個答案總是覆蓋subfunc x參數,因為沒有subfunc定義的x參數就無法調用 。所以這是不對的。


我沒有修復它,因為布魯諾的答案已經很好了。


你可以這樣寫:


def subfunc(x=10):

    print(x)


def callingfunc(x=None):

    subfunc(x)


callingfunc()

callingfunc(20)

callingfunc(30)

它打?。?/p>


None

20

30

因此,您要么傳遞一個覆蓋 10 的值,要么不傳遞,并使用callingfuncx的默認值覆蓋 10 ,在本例中為None。


查看完整回答
反對 回復 2021-06-22
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號