Pro*_*o Q 8 python typing mutable default-arguments
在 Python 中处理可变默认参数的方法是将它们设置为 None。
例如:
def foo(bar=None):
bar = [] if bar is None else bar
return sorted(bar)
Run Code Online (Sandbox Code Playgroud)
如果我输入函数定义,那么唯一的类型 forbar说的bar是Optional,很明显,它不是Optional我期望sorted在其上运行该函数的时间:
def foo(bar: Optional[List[int]]=None):
bar = [] if bar is None else bar
return sorted(bar) # bar cannot be `None` here
Run Code Online (Sandbox Code Playgroud)
那么我应该投吗?
def foo(bar: Optional[List[int]]=None):
bar = [] if bar is None else bar
bar = cast(List[int], bar) # make it explicit that `bar` cannot be `None`
return sorted(bar)
Run Code Online (Sandbox Code Playgroud)
我是否应该只希望通读函数的人看到处理默认可变参数的标准模式,并理解对于函数的其余部分,参数不应该是Optional?
处理这个问题的最佳方法是什么?
编辑:要澄清,这个功能的用户应该能够调用foo的foo()和foo(None)和foo(bar=None)。(我认为以其他方式拥有它是没有意义的。)
编辑 #2:如果您从不键入as而只键入 as ,Mypy 将无错误地运行,尽管默认值为. 但是,强烈不建议这样做,因为此行为将来可能会发生变化,并且它还会将参数隐式键入为。(有关详细信息,请参阅此内容。)barOptionalList[int]NoneOptional
None不是唯一可用的哨兵。您可以选择自己的列表值用作哨兵,None在运行时将其替换为新的空列表(而不是 )。
_sentinel = []
def foo(bar: List[int]=_sentinel):
bar = [] if bar is _sentinel else bar
return sorted(bar)
Run Code Online (Sandbox Code Playgroud)
只要没有人调用foousing_sentinel作为显式参数,bar总会得到一个新的空列表。在类似 的调用中foo([]),bar is _sentinel将为 false:两个空列表不是同一个对象,因为列表的可变性意味着您不能拥有始终被 引用的单个空列表[]。
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |