Portál AbcLinuxu, 10. května 2025 19:24
Řešení dotazu:
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.
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č.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.