2014-12-03 57 views
1

我可以在python中做到这一点,它给了我函数内可用的子模块/参数。探测python函数

在解释,我可以这样做:

>>> from nltk import pos_tag 
>>> dir(pos_tag) 
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name'] 

顺便说一句,什么是dir(function)电话吗?

如何知道调用函数需要哪些参数?例如在pos_tag的情况下,源代码的说,它需要token,看到https://github.com/nltk/nltk/blob/develop/nltk/tag/init.py

def pos_tag(tokens): 
    """ 
    Use NLTK's currently recommended part of speech tagger to 
    tag the given list of tokens. 
     >>> from nltk.tag import pos_tag # doctest: +SKIP 
     >>> from nltk.tokenize import word_tokenize # doctest: +SKIP 
     >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) # doctest: +SKIP 
     [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 
     'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), 
     ('.', '.')] 
    :param tokens: Sequence of tokens to be tagged 
    :type tokens: list(str) 
    :return: The tagged tokens 
    :rtype: list(tuple(str, str)) 
    """ 
    tagger = load(_POS_TAGGER) 
    return tagger.tag(tokens) 

如果文档字符串可用于功能是有没有办法知道什么是参数类型的函数需要一个具体参数?,例如在pos_tag以上的案例中,它的编号为:param tokens: Sequence of tokens to be tagged:type tokens: list(str)运行解释器时未读取代码就可以获取这些信息吗?

最后,有没有办法知道什么是返回类型?

只是要清楚,我不期待的文档字符串的打印输出,但上面的问题是,这样我可以做某种类型与isinstance(output_object, type)

回答

2

下面后来检查是回答你的四个问题。恐怕你想做的一些事情在标准库中是不可能的,除非你想自己解析文档。

(1)顺便说一下,什么是目录(函数)调用?

如果我没有理解这个问题,我相信文档回答这个问题here

如果对象有一个名为__dir__()方法,这个方法会被称为 并且必须返回列表属性。这允许 实现定制__getattr__()__getattribute__()函数的对象 定制dir()报告它们的属性的方式。

如果对象不提供__dir__(),该函数试图从对象的__dict__属性最好 收集信息,如果 定义,并从其类型的对象。

(2)如何知道调用函数需要哪些参数?

最好的办法是使用inspect

>>> from nltk import pos_tag 
>>> from inspect import getargspec 
>>> getargspec(pos_tag) 
ArgSpec(args=['tokens'], varargs=None, keywords=None, defaults=None) # a named tuple 
>>> getargspec(pos_tag).args 
['tokens'] 

(3)如果文档字符串可用于功能是有办法 知道什么是参数类型的函数期望为一个 特定参数?

不在标准库中,除非你想自己解析文档字符串。你可能已经知道,你可以访问这样的文档字符串:

>>> from inspect import getdoc 
>>> print getdoc(pos_tag) 
Use NLTK's currently recommended part of speech tagger to 
tag the given list of tokens. 

    >>> from nltk.tag import pos_tag 
    >>> from nltk.tokenize import word_tokenize 
    >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) 
    [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 
    'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), 
    ('.', '.')] 

:param tokens: Sequence of tokens to be tagged 
:type tokens: list(str) 
:return: The tagged tokens 
:rtype: list(tuple(str, str)) 

或本:

>>> print pos_tag.func_code.co_consts[0] 

    Use NLTK's currently recommended part of speech tagger to 
    tag the given list of tokens. 

     >>> from nltk.tag import pos_tag 
     >>> from nltk.tokenize import word_tokenize 
     >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) 
     [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 
     'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), 
     ('.', '.')] 

    :param tokens: Sequence of tokens to be tagged 
    :type tokens: list(str) 
    :return: The tagged tokens 
    :rtype: list(tuple(str, str)) 

如果你想尝试分析自己的PARAMS和“类型”,您可以用启动一个正则表达式。显然,我使用的是“类型”这个词。此外,这种方法将只用于列出其参数和类型在这种特定的方式工作文档字符串:当然

>>> import re 
>>> params = re.findall(r'(?<=:)type\s+([\w]+):\s*(.*?)(?=\n|$)', getdoc(pos_tag)) 
>>> for param, type_ in params: 
    print param, '=>', type_ 

tokens => list(str) 

这种做法的结果会给你PARAMS及其相应的说明。您也可以通过分割字符串,只保留那些符合以下要求的话检查的描述中的每个字:

>>> isinstance(eval(word), type) 
True 
>>> isinstance(eval('list'), type) 
True 

但是,这种方法可能会很快变得复杂,试图解析的pos_tag最后一个参数时尤其如此。而且,docstrings通常不会有这种格式。所以这可能只适用于nltk,但即使不是所有的时间。

(4)最后,有没有办法知道什么是返回类型?

再次,恐怕不是,除非你想使用上面的正则表达式来梳理文档字符串。返回类型可能会根据arg(s)类型的不同而有所不同。 (考虑到将与任何可迭代工作的任何功能。)如果你想尝试(再次,在pos_tag文档字符串的精确格式)提取文档字符串此信息,您可以尝试另一个正则表达式:

>>> return_ = re.search(r'(?<=:)rtype:\s*(.*?)(?=\n|$)', getdoc(pos_tag)) 
>>> if return_: 
    print 'return "type" =', return_.group() 

return "type" = rtype: list(tuple(str, str)) 

否则,我们在这里可以做的最好的办法是获得源代码(这又是明确的你不想要的):

>>> import inspect 
>>> print inspect.getsource(pos_tag) 
def pos_tag(tokens): 
    """ 
    Use NLTK's currently recommended part of speech tagger to 
    tag the given list of tokens. 

     >>> from nltk.tag import pos_tag 
     >>> from nltk.tokenize import word_tokenize 
     >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) 
     [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 
     'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), 
     ('.', '.')] 

    :param tokens: Sequence of tokens to be tagged 
    :type tokens: list(str) 
    :return: The tagged tokens 
    :rtype: list(tuple(str, str)) 
    """ 
    tagger = load(_POS_TAGGER) 
    return tagger.tag(tokens) 
+0

很好的答案!!!! – alvas 2014-12-03 13:27:43

+0

@alvas你问很好的问题!我爱你如何深入挖掘nltk。 – 2014-12-03 13:51:44