我正在尝试根据给定的参数定义一个不同的函数。
下面是谓词过滤器,用于给定字符串 类型参数,它标记每个单词的部分演讲,然后返回形容词,副词或动词。
但有时候,在我的整个系统管道中,给定的参数可能是 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
答案 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:
...