Portál AbcLinuxu, 14. května 2024 08:32


Dotaz: Python a import souborů

14.7.2015 15:53 Kolemjdoucí
Python a import souborů
Přečteno: 309×
Odpovědět | Admin
Ahoj. Začínám tvořit v Pajtnu celkem složitý projekt a uvízl jsem na importu. Pokud budu importovat třeba class s názvem Foo() a tato třída bude umístěna v /a/b/c/d/__init__.py tak ji sourcnu from a.b.c.d import Foo a zavolám a.b.c.d.Foo(). Potud vše OK, ale když potřebuji z class Foo() volat další class Bar(), sourcnu from a.b.c.d import Bar a zavolám Bar(). Jenže potřebuji zachovat strukturu, čili bych chtěl i z class Foo() volat a.b.c.d.Bar() namísto jen Bar() či self.Bar(). Poradí někdo?

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

rADOn avatar 14.7.2015 16:52 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Python a import souborů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj. Začínám tvořit v Pajtnu celkem složitý projekt a uvízl jsem na importu. Pokud budu importovat třeba class s názvem Foo() a tato třída bude umístěna v /a/b/c/d/__init__.py…
Kdyz uz tak v a/b/c bude d.py a v nem tridy. __init__.py na tyhle veci nezneuzivej.
…tak ji sourcnu from a.b.c.d import Foo a zavolám a.b.c.d.Foo(). Potud vše OK…
Ne, to neni ok. from…import ti udela referenci na Foo ale ne a.b.c.d takze jestli ti to nevybouchne tak mas nekde schovanej import a.b.c.d. Pak ti ale nic nezaruci ze Foo je reference na stejny objekt jako a.b.c.d.Foo, coz je chyba ktera se ti muze pekelne nevyplatit. Cely je to ukazkovy priklad proc je radno se from…import vyhybat.
…ale když potřebuji z class Foo() volat další class Bar(), sourcnu from a.b.c.d import Bar a zavolám Bar(). Jenže potřebuji zachovat strukturu, čili bych chtěl i z class Foo() volat a.b.c.d.Bar() namísto jen Bar()…
Kdyz bude a (tedy ten prvni modul z a.b.c.d) nekde v PYTHONPATH tak to bude fungovat. Ale cely je to nesmysl – kdyz nechces aby se moduly chovaly jako moduly, tak je proste nepouzivej. Ty tecky nejsou jen syntakticky cukr ktery kompiler dereferencuje a zapomene jako treba v jave. Jednoduse receno, kazda tecka je nejaky jmenny prostor (modulu, objektu nebo instance). A pokud je budes vyrabet zbytecne jen proto ze to dobre vypada ve zdrojaku, tak strukturu nezachovavas ale naopak rozbijis.
…či self.Bar(). Poradí někdo?
Tezko rict kdyz nenapises o co se snazis. Pokud opravdu potrebujes takhle strukturovat jmenne prostory tak bych misto ohybani modulu spis udelal proxy objekty ktere to zaridi v __getattr__(). Ale vzhledem k tomu ze viditelne netusis jak funguji jmenne prostory bych spis rekl ze se snazis realizovat nejaky zlozvyk z jineho jazyka ktery v pythonu nedava smysl.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
Bystroushaak avatar 19.7.2015 22:18 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Python a import souborů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle smrdí javou.
potřebuji zachovat strukturu, čili bych chtěl i z class Foo() volat a.b.c.d.Bar() namísto jen Bar() či self.Bar()
Docela by mě zajímalo proč.
blog.rfox.eu

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.