Как достать функцию из функции?
У меня есть два файла:
- Index.py
- 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 шт):
Вопрос из серии: и на ёлку влезть... Без обид. Можно конечно сконструировать что-то типа:
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
можно присваивать переменной, передавать в параметрах, сохранять в списках, возвращать из функции и т.п. Мне кажется, с классом Ваша жизнь существенно упростится.