Может ли функция использовать другую функцию в том же классе? - PullRequest
0 голосов
/ 12 сентября 2018

Я хотел бы уменьшить свой код и подумать о создании одной функции, собирающей контент из другого класса, а затем передать мои будущие функции в «content_collector», чтобы иметь возможность доступа к переменным (note_input, title_lable, ...).

Во-первых, как указано в вопросе, могут ли функции обращаться к переменным в других функциях?

Я также пытался сделать их глобальной переменной, но я получаю {SyntaxError: name 'note_input' назначается перед глобальным объявлением}

В противном случае я пытался создать переменные внеФункция, но внутри класса, но я предполагаю, что есть проблема наследования, потому что «я» не распознается.

class Functions:

    def content_collector(self):

        note_input = self.note_entry.get("1.0", "end-1c")
        title_label = self.title_entry.get()
        author_label = self.author_entry.get()
        year_label = self.year_entry.get()
        others_label = self.others_entry.get()

        global note_input, title_label, author_label, year_label, others_label


    def file_saveas(self):

       dic = {"title": title_label,
              "author": author_label,
              "year": year_label,
              "other": others_label,
              "note": note_input}

class EntryWidgets(Functions):

    def __init__(self, master):...

Как всегда, большое спасибо за ваши полезные ответы!

1 Ответ

0 голосов
/ 12 сентября 2018

[..] могут ли функции обращаться к переменным в других функциях?

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

Что касается вашего SyntaxError: как говорится, вы пытаетесь сделать ваши переменные глобальными после присвоения им значений. Вам нужно переместить оператор global в начало вашего метода content_collector. Даже тогда эти имена будут известны только после того, как content_collector выполнится хотя бы один раз (потому что только тогда эти имена становятся доступными за пределами локальной области действия оператора global). Вызов file_saveas перед вызовом content_collector приведет к ошибке NameError.

Вместо того, чтобы делать ваши переменные глобальными, вы можете сделать их переменными экземпляра, например, в методе __init__ или пусть content_collector возвращает эти значения, например ::

class Functions:

    def content_collector(self):

        dic = {"note": self.note_entry.get("1.0", "end-1c"),
               "title": self.title_entry.get(),
               "author": self.author_entry.get(),
               "year": self.year_entry.get(),
               "other": self.others_entry.get()}
        return dic


    def file_saveas(self):

       dic = self.content_collector()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...