开发者社区> 问答> 正文

Python如何区分默认参数?

a = iter([1]) next(a) next(a)

引发StopIteration

*

a = iter([1]) next(a) next(a, None)

没有StopIteration

*但是next的定义是

def next(迭代器,默认=无):

Python如何区分参数是默认参数还是用户指定的参数?

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 00:05:55 461 0
1 条回答
写回答
取消 提交回答
  • 内置函数next不使用None作为默认值。实际上,正如您在C源代码(对于cpython,官方Python解释器)中所看到的那样,其参数处理非常低级。纯Python等效项将在函数定义中使用* rgs并手动检查是否有一个或两个参数。可能是这样的:

    def next(\*rgs):
        assert(1 <= len(args) <= 2)
        try:
            return args[0].__next__()
        except StopIteration:
            if len(args) > 1:
                return args[1]
            else:
                raise
    

    在Python中复制类似行为的一种更好的方法是使用默认值,该默认值对于外部代码意外提供是不可能的。这是执行此操作的一种好方法:

    _sentinel = object() # a unique object that no user should ever pass to us
    
    def next(iterator, default=_sentinel):
        try:
            return iterator.__next__()
        except StopIteration:
            if default is not _sentinel:
                return default
            else:
                raise
    

    回答来源:stackoverflow

    2020-03-24 00:06:01
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载