Как достать функцию из функции?

У меня есть два файла:

  1. Index.py
  2. functions.py

В первом я пишу интерфейс своей программы при помощи библиотеки flet.

Во втором я пишу функции, и при помощи import functions я подключил возможность вызывать функции из второго файла.

Проблема в том, что мне нужно наоборот: функцию, которая написана в index.py, нужно вызвать в functions.py.

Если сделать то же самое (import index), то нужная мне функция не вызывается.


Как я понимаю, почему это происходит:

Моя функция находится в def main, и если какая-то функция может быть вызвана, то только def main.

Если вынести функцию clear_page (функция, которую мне нужно вызвать в function.py), то и она станет доступной для вызова.

Но тогда она будет бесполезной, т. к. всё, на что она влияет, осталось в def main. Т. е. получается такая ситуация, что если она в функции main, то она недоступна, а если вне её, то она не работает.

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

Скажем, в def main работает только в def main.

Вот код из index.py:

import flet as ft
import functions as f

def main(page: ft.Page):
    page.title = "MP"

    def clear_page():
        page.controls.clear()
        page.update

    side_buttons = ft.Row(
        [
            ft.Row(
                [
                    ft.Text("Choose your start side")
                ]
            ),
            ft.ElevatedButton(text="CT-Side", on_click=f.ct_side),
            ft.ElevatedButton(text="T-Side", on_click=f.t_side)
        ],
        alignment=ft.MainAxisAlignment.CENTER,
        vertical_alignment=ft.CrossAxisAlignment.CENTER,
        expand=True
    )

    page.add(side_buttons)

ft.app(target=main)

И вот то, что в functions.py:

from index import main, clear_page

player_side = "None"

def ct_side(e):
    player_side == "CT"
    clear_page()
    print("CT")

def t_side(e):
    player_side == "T"
    clear_page()
    print("T")

Сразу скажу, что то, что написано в functions.py (from index import main, clear_page) не работает.

main сама по себе почему-то не работает. А clear_page, как я понял, просто не вызывается.

Если навестись, то будет (import) clear_page: Any, а main пишет:

Доступ к main не осуществляется Pylance.


Подытожим:

Получается, что то, что написано в def main, работает только в def main. Если вынести из неё функцию, то она не будет работать потому, что получается так, что def main будто делает их приватными (личными), только для себя.

Получить любые данные, любые значения переменных из def main нельзя. Они будто вне def main просто не существуют.

В дополнение: если попробовать функции из functions.py записать в index.py хоть в, хоть вне def main, работать оно всё равно не будет.


Ответы (1 шт):

Автор решения: Vladimir Bogdanov

Вопрос из серии: и на ёлку влезть... Без обид. Можно конечно сконструировать что-то типа:

def main():
    def inside():
        print('Hello from inside!')
    main.inside = inside

main()
main.inside()

Но в вашем случае это не поможет, т.к. clear_page работает с локальной переменной page, которая передается в main.

Попробуйте преобразовать функцию main в класс main. Метод класса __call__ позволит вызывать класс как функцию, т.е. как main(). А метод класса clear_page позволит вызывать нужную Вам функцию через экземпляр.clear_page(). При этом переменную page можно задавать при инициализации класса и хранить ее в экземпляре класса. Доступ к ней можно будет получить как к атрибуту класса. Сам же класс main можно присваивать переменной, передавать в параметрах, сохранять в списках, возвращать из функции и т.п. Мне кажется, с классом Ваша жизнь существенно упростится.

→ Ссылка