python– 默认可变参数的惯用方法

python– 默认可变参数的惯用方法,第1张

概述在python中,如果直接将可变类型作为默认参数,则会出现一个众所周知的边缘情况:def foo(x=[]): return x y = foo() y.append(1) print foo() 通常的解决方法是将参数默认为None,然后将其设置在正文中.然而,有3种不同的方法可以做到这一点,其中2种基本相同,但第三种是完全不同的.def foo(x=No

在python中,如果直接将可变类型作为默认参数,则会出现一个众所周知的边缘情况:

def foo(x=[]): return xy = foo()y.append(1)print foo()

通常的解决方法是将参数默认为None,然后将其设置在正文中.然而,有3种不同的方法可以做到这一点,其中2种基本相同,但第三种是完全不同的.

def foo(x=None):    if x is None:        x = []    return x

这就是我经常看到的.

def foo(x=None):    x = [] if x is None else x    return x

语义相同.一条线更短,但有些人抱怨python的三元组是不自然的,因为它不是以条件开始并建议避免它.

def foo(x=None):    x = x or []

这是最短的.我今天才了解到这种疯狂.我知道lisp所以这对我来说可能不像一些python程序员那么令人惊讶,但我从没想过这会在python中运行.这种行为是不同的;如果你传递的东西不是None而是评估为false(如False),它将不会覆盖默认值.如果默认值不评估false,则无法使用它,因此如果您有非空列表或dict默认值,则无法使用它.但是,根据我的经验,空列表/摘要是99%的感兴趣的案例.

关于哪个是最pythonic的想法?我意识到这里有一个观点要素,但我希望有人可以给出一个很好的例子或推理,以确定什么是最惯用的.与大多数社区相比,python倾向于强烈鼓励人们以某种​​方式做事,所以我希望这个问题及其答案即使不完全是黑白也会有用.

最佳答案我会选择#1,因为它更简单;暗示其“其他”分支.误解它更难.

在这种特殊情况下我不会使用#3:对于None,[],{},(),0和其他一些东西,bool(x)同样是假的.如果我错误地将0传递给需要列表的函数,那么如果函数快速失败则更好,而不是将零误认为空列表!

在其他情况下,c和x else y可能是一个方便的三元运算符,但你必须控制c的类型;当它是局部变量而不是函数参数时,它会更容易.

如果你经常发现自己用一个值代替None,那么white就是一个函数.考虑像x = replace_none(x,[])之类的东西.

总结

以上是内存溢出为你收集整理的python – 默认可变参数的惯用方法全部内容,希望文章能够帮你解决python – 默认可变参数的惯用方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1206210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存