#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, все еще не до конца понимая, почему возникает ошибка выхода за пределы диапазона.