【问题标题】:Default argument alternative to None?默认参数替代无?
【发布时间】:2015-05-12 02:28:31
【问题描述】:

我正在写一个有点像这样的函数:

def parse(string, default=None):
    try:
        ...  # Body of function here
    except ParseError:
        if default is not None:
            return default
        raise

但是,如果我真的希望函数返回 None,就会遇到问题。

if len(sys.argv) > 4:
    if flag.ignore_invalid:
        result = parse(sys.argv[4], None)  # Still raises error
    else:
        result = parse(sys.argv[4])

我试图解决的问题是:

_DEFAULT = object()

def parse(string, default=_DEFAULT):
    ...
        if default is not _DEFAULT:
            ...

但这似乎是我想多了,而且似乎有更简单的方法。

anyall 函数执行此操作(默认允许 None),但我不知道如何。

【问题讨论】:

  • 如果None 不合适,object 是一个合理的前哨 - 请注意,您可以使用default=object(即类)而不是default=_DEFAULT(一个实例)来节省额外的任务。 object is object 也可以避免使用奇怪的 __eq__ 实现的返回值问题。相关:stackoverflow.com/q/1118454/3001761
  • 您的_DEFAULT 是一个非常合理的选择。
  • 默认值只需要是一个永远不能是调用者传递的有效参数的值。自定义实例效果很好,因为调用者虽然理论上可以创建一个与您的哨兵等于的对象,但他永远无法创建一个 is 您的哨兵。如果他显式调用该方法并引用您的哨兵,那么这几乎不是您的问题:)

标签: python function default-parameters


【解决方案1】:

除非您经常需要忽略ParseError,否则我会让parse 一直抛出,并且只在我需要的地方捕获它:

try:
    parse(sys.argv[4])
except ParseError:
    if not flag.ignore_invalid:
        raise

虽然如果你必须有一个默认值,那么_DEFAULT解决方案就可以了。

【讨论】:

  • 我认为重构我的整个代码是正确的选择。
【解决方案2】:

如何使用关键字参数,然后您可以检查用户是否传递了任何东西:

def parse(string, **kw):
    try:
        ...  # Body of function here
    except ParseError:
        if 'default' in kw:
            return kw['default']
        raise

缺点是如果有人拼错了default,您将无法捕捉到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2016-01-06
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多