3

デフォルトの引数を取り、指定されていない場合に特別な動作をする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でこれを行う慣用的な方法は何ですか?

4

2 に答える 2

6

私は通常好きです

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が有効なデフォルト値になることはないことを前提としています。

于 2011-02-08T18:58:14.443 に答える
1

*argsおよび/または**kwargsに基づいてそれを行うことができます。

getwrapに基づくの代替実装は次の*argsとおりです。

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!'
于 2011-02-08T18:18:36.930 に答える