1

我正在使用Python 2.7。有没有办法将名称、描述以及可能的其他元数据与函数关联起来,这样我就不必使用外部字典来保存这些信息,如下面的代码:

def predicateA(v):
    # some logic that eventually returns a True/False value
    return True

def predicateB(v):
    # some logic that eventually returns a True/False value
    return False

predicateNames={}
predicateNames[predicateA]='name and description for predicateA'
predicateNames[predicateB]='name and description for predicateB'

predicates = [predicateA, predicateB]

def evalForAllPredicates(v):
    for f in predicates:
       result = f(v)
       print "function %s returned: %s" % (predicateNames[f], result)

evalForAllPredicates(3)
4

4 回答 4

2

如果你的函数有合适的文档字符串,你可以使用__name__and__doc__属性

>>> def predicateA(v):
    '''some logic that eventually returns a True/False value
    '''
    return True

>>> predicateA.__doc__
'some logic that eventually returns a True/False value\n    '
>>> predicateA.__name__
'predicateA'

在您的示例中,您想要的描述是通过 doc 字符串,并放置在函数头之后的三重双或单代码中。除非你这样做,否则你__doc__将返回空。

于 2013-02-01T08:54:48.753 回答
2

__name__您可以通过and__doc__属性访问函数的名称及其文档字符串。函数的文档字符串只是作为函数中第一条语句放置的字符串文字。约定是使用三引号将文档字符串括起来,因为它们预计会跨越多行。

def predicateA(v):
    """
    some logic that eventually returns a True/False value
    """
    return True

print "Name:", predicateA.__name__
print "Doc:", predicateB.__doc__

要将任意元数据关联到函数,只需将您喜欢的任何属性分配给函数,就好像它是一个普通对象一样,毕竟它就是。

def predicateB(v):
    """
    some logic that eventually returns a True/False value
    """
    return False

predicateA.alwaysReturnsFalse = False
predicateB.alwaysReturnsFalse = True

for pred in [predicateA, predicateB]:
    print "Function:", pred.__name__
    print "Documentation:", pred.__doc__
    if pred.alwaysReturnsFalse:
        print "(This function always returns false)"
功能:谓词A
文档:
    一些最终返回 True/False 值的逻辑

功能:谓词B
文档:
    一些最终返回 True/False 值的逻辑

(此函数始终返回 false)
于 2013-02-01T09:02:10.730 回答
1

您可以向函数添加各种属性,并且可以包含一个文档字符串:

def fun(x)
    """
    Description ...
    """
    pass

fun.foo = 2
fun.baz = "will do naught"
于 2013-02-01T08:53:08.927 回答
1

您可以使用__name____doc__属性分别获取函数名和文档字符串。

于 2013-02-01T08:53:20.283 回答