Python:如何将函数分配给Object属性?

时间:2012-08-18 06:24:40

标签: python python-2.7 function dictionary-missing

基本上这是从我在尝试查找索引中是否存在索引时遇到的问题开始的:

if collection[ key ]: # if exist
    #do this
else: # if no exist
    #do this

但是当索引确实不存在时,它会抛出一个KeyError。 所以,阅读Python文档。如果缺少()已定义,则不会抛出 KeyError

collection = {}
def collection.__missing__():
    return false

终端上面的代码告诉我:

ghelo@ghelo-Ubuntu:~/Music$ python __arrange__.py
  File "__arrange__.py", line 16
    def allArts.__missing__():
               ^
SyntaxError: invalid syntax

那么,如何正确地做到这一点? 顺便说一下,我需要在这上面使用Python 2.7。在Python 3上运行时有区别吗?

4 个答案:

答案 0 :(得分:6)

您就是这样做的:

if key in collection:

或者,正如@sdolan所建议的那样,您可以使用.get方法,如果它不存在,则会返回默认值(可选的第二个参数)。

if collection.get(key, None):

如果你想使用__missing__,你可以将它应用于扩展dict的类(在这种情况下):

class collection(dict):

    def __missing__(self, key):
        print "Too bad, {key} does not exist".format(key=key)
        return None


d = collection()
d[1] = 'one'

print d[1]

if d[2]:
    print "Found it"

<强>输出

one
Too bad, 2 does not exist

答案 1 :(得分:0)

您可以通过使用try..except处理KeyError异常来检查密钥是否存在,如下所示。

try:
    collection[key]
    # do this
except KeyError:
    # do that

这种编码风格称为EAFP,意思是“更容易请求宽恕而非许可”http://docs.python.org/glossary.html#term-eafp

另一种方法是使用get方法,如果找不到密钥,默认情况下会返回

if collection.get(key) is not None:
    # do this
else:
    # do that

答案 2 :(得分:0)

已经有几个答案显示了您在实际情况下应该做的事情,但缺失也可以做您所问过的事情。

如果你想使用它,你需要继承dict。

class mydict(dict):
  def __missing__(self, key):
    return 'go fish'

然后你可以创建一个:

d = mydict()

并使用

访问它
d[0]
=> 'go fish'
d[0] = 1
d[0]
=> 1

答案 3 :(得分:0)

您可以使用if selection.has_key(keylookingfor)。