Python中提供默认值的最惯用方法是什么?

6
许多讨论和SO搜索都没有能够得出一个最好/最安全/最Pythonic的答案,用于在Python函数中接收None参数时提供默认值。这特别涉及到datetime参数,如果需要的话,但理想情况下我们要统一所有参数类型的方法。
以下是两种方法,它们都被认为是“正确”的方式:
  1. myval if myval else defaultval
  2. myval or defaultval
它们是否在功能上等价,还是两者之间存在微妙的差异?我非常喜欢第二种选项的简洁和清晰度,但第一种选项的支持者说它并不总是安全的。希望有比我更多Python经验(例如几乎所有人)的人可以给予指导,将不胜感激。
3个回答

3

1是条件赋值中远远最受欢迎的方法(显式优于隐式)

而且更好的方法是显式赋值

myval = myval if myval is not None else defaultval

甚至更好
def some_function(arg1,arg2="defaultValue"):
    myval = arg2

主要问题是:
x = x or y

永远不能将x分配为0或空数组或任何其他假值


1
首先,考虑一个对象类型,其中可能的值之一被认为是“False”,例如 int。选项一允许您更明确地说明您希望默认值满足哪些条件,以及您希望用户提供什么条件。 - aruisdante
那么,如果提供了明确的None值...为什么会给你一个默认值呢?这需要进行更多的处理。 - Joran Beasley
@aruisdante,然而OP的选项一并没有这样做,它只是检查了myval而不是myval is not None或其他。 - user395760
3
是的,我的评论是回应原始发帖者发表并删除的评论。我想指出你函数默认值中的一个缺陷,那就是方法中的默认值只会在解析时被评估一次。对于像字符串或数字这样的不可变类型,这并不重要,但对于可变类型如日期时间或列表,如果你修改默认值它会出现非常意外的行为(它会跨越不同的调用保留)。对于可变类型,你应该总是将它们默认为 "none",然后在方法体内分配它们的默认值。 - aruisdante
我已经接受了这个答案,但根据@aruisdante的评论,我实际上正在使用此代码将空白的datetime参数默认为datetime.utcnow(),因此我不能使用参数默认值。我将使用myval = myval if myval is not None else defaultval结构。 - Joel P.
显示剩余3条评论

2
它们是完全等价的,不过我建议
defaultval if myval is None else myval

(当传递ie myval = []时,它的行为是正确的)。

1
根据文档,两个选项在语义上是等价的,您可以选择您喜欢的选项:
语句:x or y;结果:如果x为假,则为y,否则为x,注释: 这是一个短路运算符,因此它只在第一个参数为False时才评估第二个参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接