Ошибка с переменными, объявленными с помощью self
У меня есть этот код, который вытягивает в каждой строке текстовый файл, как эта строка:
13797906 23 n 04 flood 0 inundation 0 deluge 0 torrent 0 005 @ 13796604 n 0000 + 00603894 a 0401 + 00753137 v 0302 + 01527311 v 0203 + 02361703 v 0101 | an overwhelming number or amount; "a flood of requests"; "a torrent of abuse"
и это дает мне ошибки в том, как переменные объявлены. Код ниже сокращен, так как он слишком длинный для публикации здесь.
#!/usr/bin/python
# -*- coding: utf-8 -*-
from rdflib import URIRef, Graph
from StringIO import StringIO
class Wordnet():
def __init__(self):
self.graph = Graph()
self.before_at = ''
self.after_at = ''
self.word_part = ''
self.gloss_part = ''
self.lex_filenum = ''
self.synset_offset = ''
.............more declarations(too long to add here).....
def process_file(self):
self.file = open("new_2.txt", "r")
return self.file
def line_for_loop(self, file):
for line in file:
self.split_pointer_part(line)
self.split_word_part(line)
self.split_gloss_part(line)
self.process_lex_filenum(word_part) ###error starts here on line 48
self.process_synset_offset(word_part)
.............more methods(too long to add here).....
def split_pointer_part(self, line):
self.before_at, self.after_at = line.split('@', 1)
return self.before_at, self.after_at
def split_word_part(self, line):
self.word_part = line.split()
return self.word_part
def split_gloss_part(self, line):
self.gloss_part = line.strip().split('|')
return self.gloss_part
def process_lex_filenum(self, word_part):
self.lex_filenum = word_part(1)
return self.lex_filenum
def process_synset_offset(self, word_part):
self.synset_offset = word_part[0]
return self.synset_offset
............plus more................
def print_graph(self, graph):
print graph.serialize(format='nt')
if __name__ == '__main__':
wordnet = Wordnet()
my_file = wordnet.process_file()
wordnet.line_for_loop(my_file) ###line 225
wordnet.print_graph(graph)
Когда я пытаюсь запустить этот файл, я получаю эту ошибку
File "wordnet.py", line 225, in <module>
wordnet.line_for_loop(my_file)
File "wordnet.py", line 48, in line_for_loop
self.process_lex_filenum(word_part)
NameError: global name 'word_part' is not defined
Строки 48 и 225 показаны в комментариях к блоку выше. Я не знаю, так ли это, как я объявляю переменные self или как я передаю их в каждый метод, или даже как он вызывается в __main__
но я просто не знаю, что я здесь сделал неправильно. Я довольно новичок в Python, поэтому некоторые из них сложны для меня
2 ответа
"NameError: глобальное имя"word_part"не определено" говорит вам, что python не может найти глобальную переменную с именем "word_part", поэтому вам нужно заменить word_part на self.word_part в строке 48.
Ошибка не с self. ...
, Это с глобальной переменной world_part
:
File "wordnet.py", line 225, in <module>
wordnet.line_for_loop(my_file)
File "wordnet.py", line 48, in line_for_loop
self.process_lex_filenum(word_part)
NameError: global name 'word_part' is not defined
Где сделал world_part
родом из?
если это действительно глобальная переменная, она должна быть определена вне класса:
wold_part = this_or_that # initialize class Wordnet(): def __init__(self): ... def line_for_loop(self, file): ... self.process_lex_filenum(word_part) # use
если это переменная модуля, то есть переменная, определенная в глобальной области видимости другого модуля, вы должны импортировать ее:
from my_world_module import world_part # import class Wordnet(): def __init__(self): ... def line_for_loop(self, file): ... self.process_lex_filenum(word_part) # use
если это переменная экземпляра, вы должны ссылаться на нее из себя:
class Wordnet(): def __init__(self): self.world_part = this_or_that # initialize def line_for_loop(self, file): ... self.process_lex_filenum(word_part) # use