指定默认参数的惯用方式,其存在/不存在很重要

发布于 2024-10-16 11:21:59 字数 564 浏览 6 评论 0原文

我经常看到 python 代码采用默认参数,并且在未指定参数时具有特殊行为。

例如,如果我想要这样的行为:

def getwrap(dict, key, default = ??):
    if ???: # default is specified
        return dict.get(key, default)
    else:
        return dict[key]

如果我自己推出,我最终会得到类似的结果:

class Ham:
    __secret = object()
    def Cheese(self, key, default = __secret):
        if default is self.__secret:
            return self.dict.get(key, default)
        else:
            return self.dict[key]

但当肯定有标准时,我不想发明一些愚蠢的东西。在 Python 中执行此操作的惯用方法是什么?

I often see python code that takes default arguments and has special behaviour when they are not specified.

If I for example want behavior like this:

def getwrap(dict, key, default = ??):
    if ???: # default is specified
        return dict.get(key, default)
    else:
        return dict[key]

If I were to roll my own, I'd end up with something like:

class Ham:
    __secret = object()
    def Cheese(self, key, default = __secret):
        if default is self.__secret:
            return self.dict.get(key, default)
        else:
            return self.dict[key]

But I don't want to invent something silly when there certainly is a standard. What is the idiomatic way of doing this in Python?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧时浪漫 2024-10-23 11:21:59

我通常更喜欢

def getwrap(my_dict, my_key, default=None):
    if default is None:
        return my_dict[my_key]
    else:
        return my_dict.get(my_key, default)

,但当然这假设 None 永远不是有效的默认值。

I usually prefer

def getwrap(my_dict, my_key, default=None):
    if default is None:
        return my_dict[my_key]
    else:
        return my_dict.get(my_key, default)

but of course this assumes that None is never a valid default value.

只为一人 2024-10-23 11:21:59

您可以根据 来做到这一点*args 和/或 **kwargs

这是基于 *argsgetwrap 的替代实现:

def getwrap(my_dict, my_key, *args):
    if args:
        return my_dict.get(my_key, args[0])
    else:
        return my_dict[my_key]

下面是它的实际应用:

>>> a = {'foo': 1}
>>> getwrap(a, 'foo')
1
>>> getwrap(a, 'bar')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in getwrap
KeyError: 'bar'
>>> getwrap(a, 'bar', 'Nobody expects the Spanish Inquisition!')
'Nobody expects the Spanish Inquisition!'

You could do it based on *args and/or **kwargs.

Here's an alternate implementation of getwrap based on *args:

def getwrap(my_dict, my_key, *args):
    if args:
        return my_dict.get(my_key, args[0])
    else:
        return my_dict[my_key]

And here it is in action:

>>> a = {'foo': 1}
>>> getwrap(a, 'foo')
1
>>> getwrap(a, 'bar')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in getwrap
KeyError: 'bar'
>>> getwrap(a, 'bar', 'Nobody expects the Spanish Inquisition!')
'Nobody expects the Spanish Inquisition!'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文