In Python, can I specify a function argument's default in terms of other arguments?

这一生的挚爱 提交于 2019-11-26 20:48:54

问题


Suppose I have a python function that takes two arguments, but I want the second arg to be optional, with the default being whatever was passed as the first argument. So, I want to do something like this:

def myfunc(arg1, arg2=arg1):
    print (arg1, arg2)

Except that doesn't work. The only workaround I can think of is this:

def myfunc(arg1, arg2=None):
    if arg2 is None:
        arg2 = arg1
    print (arg1, arg2)

Is there a better way to do this?


回答1:


As @Ignacio says, you can't do this. In your latter example, you might have a situation where None is a valid value for arg2. If this is the case, you can use a sentinel value:

sentinel = object()
def myfunc(arg1, arg2=sentinel):
    if arg2 is sentinel:
        arg2 = arg1
    print (arg1, arg2)

myfunc("foo")           # Prints 'foo foo'
myfunc("foo", None)     # Prints 'foo None'



回答2:


Not really. The other argument names don't exist until the function is actually entered.




回答3:


The second way is fine in my opinion: it is exactly clear what you do, and for all those who will come after you and read the code. While there is a slight overhead in documenting the default behavior, the use of 'None' or any other to make your function generate a default value is very common. Putting logic inside the function calls would certainly not be commendable in my opinion, it could become very complex very soon. So just leave it in the function body, where all the code is.



来源:https://stackoverflow.com/questions/4575326/in-python-can-i-specify-a-function-arguments-default-in-terms-of-other-argumen

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!