在Python中使用Optional args有什么好处。而不是使用args + optional args重载一个函数(或方法),而不是具有继承的多态性就足够了吗?
我只是想了解拥有此功能的炙手可热的理由。或者是能够以多种方式做一件事的情况?
PS:我可以看到在函数式编程中使用它是有意义的,以避免必须定义许多函数实际上做几乎相同的事情,但还有其他...
答案 0 :(得分:6)
可选args与多态无关(甚至不需要你有类! - ) - 它只是(主要用途!)通常你有“很少需要”的参数选择通常以某种方式制作,但可能对调用者设置不同有用。
例如,考虑内置open
。 通常,你打开文本文件而不是二进制打开,打开它们进行阅读而不是写作,你对默认缓冲很满意 - 所以,你只需要open('thefile.txt')
和从此过上幸福的生活。能够指定要在其中打开的 way (二进制,用于覆盖,用于追加,......)作为第二个(可选)参数,而不是其默认的'r'
值,当然经常有用。一旦进入蓝色月亮,你想要一个具有特殊缓冲选项的文件对象,而然后将缓冲作为第三个(可选)参数(默认值为course)支付大笔红利......没有它阻碍你打开绝大多数文件!
继承和多态性在如此简洁地获得with open('blah.txt') as f:
的便利性方面确实无济于事,同时仍允许相同的内置函数提供更多用例(例如,当您需要打开文件时)对于没有任何缓冲的二进制附加...如果你编码很多,可能每年一次;-)。当然,适用于此类内置函数的便利原则也适用于您写的函数! - )
答案 1 :(得分:4)
Python中的可选参数有多种用途,但大多数情况下它们是一种提供默认值的机制,其中存在合理且不常见的变化值。 E.g:
def open_http_connection(url, port=80, timeout=2):
#...
一个微妙的变化是当需要基于所提供的参数的方法的多个行为时,通常使用arity(参数个数)或关键字参数。
# Example of arity based optional arguments
def do_something(*args):
if not args:
do_something1()
elif len(args)==1:
do_something2(args[0])
else:
do_something3(*args)
研究如何在python中指定变量位置和关键字参数可能会有所帮助:here。
这些用于指定可选和可变数量的参数的方法不像在函数式编程语言中找到的静态类型的面向对象语言中的方法重载或多种形式的多重调度一样复杂。 Python使用动态类型(有时称为duck typing),因此这些调度形式不是惯用的或非常有用的。 (这通常不被视为限制或缺点,尽管Python必须具有足够的灵活性以支持multi-methods,如果必须拥有它们。)