如何根据参数的数据类型定义函数

时间:2018-04-27 03:35:01

标签: python function

我正在尝试根据给定的参数定义一个不同的函数。

下面是谓词过滤器,用于给定字符串  类型参数,它标记每个单词的部分演讲,然后返回形容词,副词或动词。

但有时候,在我的整个系统管道中,给定的参数可能是 list ,当然,我可以定义另一个,但是我不想定义另一个完全相同的函数

我能做到:

  

如果type(sentence)== list - > blahblahblah和

     

如果type(sentence)== string - > blahblahblah。

这很好,但我只是想知道会有另一种更好的方法来做到这一点。

有什么建议吗?

#defines predicate filter 

def pred_fl(sentence): 
    import nltk 

    ## Predicate Tags : 12 tags 
    tag_pred = ['JJ', 'JJR', 'JJS','RB','RBR', 'RBS', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ']

    ## Noun Tags : 4 tags 
    tag_noun = ['NN','NNS','NNP','NNPS']

    # Pos tagging the input from the User_reply 
    tagged = nltk.pos_tag(sentence.split())

    reply_pred = []

    for i in range(len(tagged)):
        if tagged[i][1] in tag_pred:
            reply_pred.append(tagged[i][0])

    return reply_pred

4 个答案:

答案 0 :(得分:1)

这正是重载方法和泛型函数的用途。

以下是如何使用singledispatch通过通用函数实现它:

@functools.singledispatch
def helper(arg):
    raise TypeError("I expected a type I know about, not some kind of Spanish Inquisition")

@helper.register(list)
def _(arg):
    # do listy stuff here

@helper.register(str)
def _(arg):
    # do stringy stuff here

def pred_fl(sentence): 
    # do setup that applies to all types here
    stuff = helper(sentence)
    # do stuff with stuff here

当然,我假设有一堆你的东西"对于这两种情况是相同的,它是你的"东西中的一个小的,可重构的部分。必须有所不同。

如果整个事情最终变得不同,那么你真的应该有两个功能。

另一方面,如果不同的小部分是微不足道的 - 或者它几乎不可能分解,因为它与你所做的其他事情紧密相关做 - 你可能确实想要类型切换。但是,选中isinstance(sentence, str),而不是检查type(sentence)

def pred_fl(sentence):
    # do setup that applies to all types here
    if isinstance(sentence, list):
        # do listy stuff that mutates a whole slew of local variables
    elif isinstance(sentence, str):
        # do stringy stuff that depends on a bunch of local state
    # do final stuff here

答案 1 :(得分:0)

在我看来,这是一个风格问题,但我建议的是评估函数顶部的输入,然后函数的其余部分应该能够采用相同的类型。像...这样的东西。

def pred_fl(sentence): 
    import nltk

    if isinstance(sentence, str):
        word_list = sentence.split()
    elif isinstance(sentence, list):
        word_list = sentence
    else:
        raise Exception("unexpected input: %s", sentence)

    ## Predicate Tags : 12 tags 
    tag_pred = ['JJ', 'JJR', 'JJS','RB','RBR', 'RBS', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ']

    ## Noun Tags : 4 tags 
    tag_noun = ['NN','NNS','NNP','NNPS']

    # Pos tagging the input from the User_reply 
    tagged = nltk.pos_tag(word_list)

    reply_pred = []

    for i in range(len(tagged)):
        if tagged[i][1] in tag_pred:
            reply_pred.append(tagged[i][0])

    return reply_pred

答案 2 :(得分:0)

我认为你的文件管理器功能到目前为止只处理String类型。你有一句话:

  “你好女孩!你好吗?”

但是还有另一个数据输入列表如:

  

[“你好”,“女孩”,“怎么样”,“做”,“你”,“做什么?”]

如果我认为是对的。怎么样,只需简单地将列表转换为已经实现该功能的字符串即可处理。

sentence = sentence if isinstance(sentence, str) else ' '.join(sentence)

答案 3 :(得分:-1)

如果您希望函数根据句子参数的类型表现不同,实现此目的的一种方法如下:

def pred_fl(sentence): if isinstance(sentence, str): ... elif isinstance(sentence, list): ... else: ...