Использование возвращаемого значения из одной функции класса в другую [Python]

#python #return #nltk

Вопрос:

Я работал над проектом с Python NLTK, и у меня возникли некоторые проблемы с joiner() тем, что функция не могла получить возвращаемое значение из другой функции в том же классе с именем open_file() . Мне было интересно, как именно функция возврата должна работать в этом контексте и как я могу это исправить. Спасибо всем!

Код:

 import nltk

nltk.download('wordnet')
from nltk.corpus import wordnet as wn


class Sentence:

    def open_file(self):
        file_vals = []
        i = 0
        with open("words.txt", "r") as my_file:
            for line in my_file:
                if i < 20:
                    stripped_line = line.strip()
                    file_vals.append(stripped_line)
                    i  = 1
                else:
                    print(file_vals)
                    return file_vals

    def joiner(self, file_vals):
        val_1 = wn.synsets(file_vals[0])[0].pos()
        val_2 = wn.synsets(file_vals[1])[0].pos()

        if val_1 == "n" and val_2 == "v":
            print(val_1.capitalize()   " "   val_2   ".")


my_obj = Sentence()
my_obj.open_file()
my_obj.joiner()
 

Ответ №1:

Просто обратите внимание, что вы не включили сообщение об ошибке. Однако очевидная проблема с вашим кодом заключается в том, что методы, определенные в классе, не выполняются, пока не будет создан экземпляр класса и вызван метод. Вот почему вы не можете передавать значение из одного метода в другой внутри неинстанциированного класса. Один из способов достичь того, что, по моему мнению, вы хотите сделать, заключается в следующем: это предполагает, что все остальные части вашего кода не содержат ошибок. Кроме того, я не пытался запустить ваш код.

 import nltk

nltk.download('wordnet')
from nltk.corpus import wordnet as wn


class Sentence:

    def open_file(self):
        file_vals = []
        i = 0
        with open("words.txt", "r") as my_file:
            for line in my_file:
                if i < 20:
                    stripped_line = line.strip()
                    file_vals.append(stripped_line)
                    i  = 1
                else:
                    print(file_vals)
                    return file_vals

    def joiner(self, file_vals):
        val_1 = wn.synsets(file_vals[0])[0].pos()
        val_2 = wn.synsets(file_vals[1])[0].pos()

        if val_1 == "n" and val_2 == "v":
            print(val_1.capitalize()   " "   val_2   ".")

my_obj = Sentence()
file_vals = my_obj.open_file()
my_obj.joiner(file_vals)
 

Сначала вы должны сохранить значение, возвращенное методом «open_file», а затем передать возвращенное значение в «joiner» в качестве аргумента.

Комментарии:

1. Ах да, сообщение об ошибке выглядит следующим образом: «Ошибка типа: joiner() отсутствует 1 требуемый позиционный аргумент: ‘file_vals'». Я попытался запустить код решения, и, к сожалению, возникает та же проблема.

2. Я предполагаю, что это связано с тем, что имя ` file_vals` совпадает с определением функции. Это должно сработать: « my_obj = Предложение() значения файла = my_obj.open_file() my_obj.joiner(значения файла) «

Ответ №2:

Способ, которым вы вызываете joiner() функцию, неверен. Поскольку open_file() в качестве аргумента требуется возвращаемая переменная fucntion file_vals и joiner() определенная вами функция, file_vals поэтому вы должны передать возвращаемый результат open_file() функции joiner() функции, например:

 my_obj = Sentence()
my_obj.joiner(my_obj.open_file())
 

Комментарии:

1. Спасибо, это, казалось, решило проблему с возвратом. Похоже, у меня все еще есть проблема с val_2, которая заключается в «ошибке индекса: индекс списка вне диапазона», есть идеи по этому поводу?

2. Это должно быть из-за file_vals[1] . в некоторых случаях значение при индексе 1 of отсутствует file_vals .

3. Как ни странно, распечатанный список показывает значение как с индексом 0, так и с индексом 1 на протяжении всего периода 19, все еще не до конца понимая, почему возникает ошибка выхода за пределы диапазона.