Как определить функцию по-разному на основе типов данных аргумента - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь определить функцию, которая работает по-разному в зависимости от заданного аргумента.

Ниже приведен фильтр предикатов для данной строки введите аргумент, он помечает части речи каждого слова, а затем возвращает прилагательное, наречие или глагол.

Но иногда данный аргумент может быть списком во всех моих системных конвейерах, конечно, я мог бы определить другой, но я не хочу определять другую функцию, которая точно так же работает.

Я мог бы сделать:

если тип (предложение) == список -> бла-бла, и

if type (предложение) == строка -> бла-бла-бла.

Это хорошо, но мне просто интересно, что есть другой лучший способ сделать это.

Любой совет?

#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 голосов
/ 27 апреля 2018

Я предполагаю, что ваша функция filer пока только обрабатывает тип String. и у вас есть предложение вроде:

"Привет, девочка! Как дела?"

Но есть и другой ввод данных со списком вроде:

["привет", "девушка", "как", "делать", "ты", "делать?"]

и если я правильно понял. как насчет этого, просто обработать этот список просто строкой, в которой вы уже реализовали функцию.

sentence = sentence if isinstance(sentence, str) else ' '.join(sentence)
0 голосов
/ 27 апреля 2018

Если вы хотите, чтобы ваша функция велась по-разному в зависимости от типа аргумента предложения, один из способов сделать это состоит в следующем:

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

0 голосов
/ 27 апреля 2018

По моему мнению, это вопрос стиля, но я бы посоветовал оценить входные данные в верхней части функции, и тогда остальные функции должны иметь такой же тип. Нечто подобное ..

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
0 голосов
/ 27 апреля 2018

Это как раз то, для чего предназначены как перегруженные методы, так и универсальные функции.

Вот как использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...