2010-09-10 50 views
0

在Python中使用可选参数有什么好处。使用args +可选参数不是重载一个函数(或方法),而不是使用继承的多态性就足够了?Python中的可选参数

我只是想了解具有此功能的燃烧理由。还是能够以多种方式做一件事?

PS:我可以看到,它是有道理的有它在函数式编程,以避免定义许多功能实际上这样做几乎同样的事情,但是否有任何其他的...

回答

6

可选ARGS与多态性无关(并且甚至不需要你有周围的类) - 它只是(主要用途!),通常你有“很少需要”的选择参数一般在某些方式,但它可能是有用的调用方设置不同。

例如,考虑内置open最常见的是,你打开文本文件而不是二进制打开,你打开它们来阅读而不是写作,并且你对默认的缓冲很满意 - 所以,你只需要open('thefile.txt'),并且快乐地生活。能够指定的方式作为第二个(可选)参数(而不是其默认的'r'值),您想要打开它(二进制,覆盖,附加,...)当然是有用的。一旦进入一个蓝色的月亮,你需要一个具有特殊缓冲选项的文件对象,然后将缓冲作为第三个(可选)绝大多数你打开的文件!

继承和多态并不能真正帮助获得with open('blah.txt') as f:的简便性,同时仍然允许相同的内置函数提供更多的用例(例如,当您需要打开文件以进行二进制附加没有任何缓冲...也许一年一次,如果你编码很多;-)。当然适用于这样的内置功能,方便的原则也适用于写一样好功能 - !)

4

在Python可选参数一举多得,但大多数情况下它们是一种机制,提供默认值存在明智和不经常变化的价值。例如为:

def open_http_connection(url, port=80, timeout=2): 
    #... 

当基于提供,通常使用元数(参数的数目)或关键字参数的参数都需要一个方法多个行为微妙变化。

# 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) 

它可能有助于研究位置和关键字参数如何变量蟒蛇指定:here

这些用于指定可选和可变数量参数的方法在语法上不如静态类型的面向对象语言中的方法重载或函数式编程语言中存在的各种形式的多重调度那样复杂。 Python使用动态类型(有时称为duck typing),所以这些派遣形式不是惯用的或非常有用的。 (这通常不被视为限制或缺点,尽管Python肯定足够灵活以支持multi-methods,如果必须的话)。