Nedávno tu proběhla debata o pozici pythonu jako kvalitním programovacím jazyku. Mohu tedy poprosit místní gurus o úplně základní radu?
Jsem javista. Doma dělám na soukromém projektu v pythonu, protože už mám nějaký kód z dřívějška a (zatím) se mi to nechce přepisovat do javy. Používám pycharm, python 3.4 v Mintu 18.
Snažím se psát objektově, protože jsem na to zvyklý. Současně mám rád v jednom souboru jednu "public" třídu (může obsahovat i "privátní", které se nepoužívají jinde). Samozřejmě chci používat v maximální míře typehinty, abych se v kódu vyznal a maximálně využil možnosti IDE. Bohužel typehinty vyžadují importy a vedou přímo na zakázané circular importy. Diskuse bez rozumného závěru je např.
https://github.com/python/typing/issues/105 ,
https://stackoverflow.com/questions/39740632/python-type-hinting-without-cyclic-imports .
Doporučuje se:
forward reference jako string - i pro tu chce IDE import statement, aby věděl, kde to najít
import xxxxxx bez from a v kódu použít celou cestu - mám projekt ve vnořených modulech, abych to měl aspoň trochu rozdělené. Typehinty jsou pak hodně dlouhé - lze to prosím nějak naaliasovat, abych pokaždé nemusel uvádět celou cestu?
I tak mi to nefunguje - příklad:
Modul ui (s __init__.py) -> soubor webui.py -> class WebUI.
Ve stejném adresáři chci ve třídě ui/webapp.py-> class WebApp v metodě volané zvenku označit typehintem třídu WebUI. Ta ale vytváří instanci třídy WebApp, tudíž samozřejmě má soubor webap.py importovaný.
Zkusím standardní import:
from uis.webui import WebUI
...
def main(self, webui: WebUI):
Klasický circular import vzniklý pouhým typehintováním WebUI, nogo.
Dobře, zkusím variantu pouhého importu
import ui.webui
...
def main(self, webui: uis.webui.WebUI):
Výsledkem je
AttributeError: module 'uis' has no attribute 'webui'
Samozřejmě mohu nic neimportovat, WebUI dát jako string, ignorovat chybu IDE, že daný typ nezná a rezignovat na jakékoliv nabídky proměnných atd. Takový vývoj je mi však silně proti srsti.
Mohu poprosit o zkušenosti, jak v praxi řešíte typehinty a circular importy? Předem díky moc.