Portál AbcLinuxu, 12. května 2025 04:25
import cursestak se bude načítat tento soubor
/usr/lib/python3.4/curses/__init__.pyjenže v tomto souboru se načítá
from _curses import *a pak se v jiných funkcích volá (stále v tom stejném souboru)
import _curses, cursesJelikož umím jen PHP tak mi není jasné, proč volá soubor
/usr/lib/python3.4/curses/__init__.pyzase sám sebe a taky nechápu proč se to nezacyklí ? Taky mi není jasné ten import
from _curses import *soubor ani adresář s názvem _curses neexituje, tak odkud se to načítá ? Děkuji za informace
from _curses import *
nejspíš importuje /usr/lib/python3.4/lib-dynload/_curses.cpython-34m.so
, což by měl být python module v C/C++ link
A zacyklení importu nevím, možná to řeší sám python, stejně jako mnohonásobný import?
Každopádně zajímavý dotaz. Ani jednou odpovědí si nejsem na 100% jistý, pokud by to byl někdo schopen potvrdit/vyvrátit, rád bych se dozvěděl víc.
Modul _curses je naprogramován v jazyku C, takže zkompilovanou binárku nalezneš na jiném místě než moduly v čistém Pythonu:
$ ipython
In [1]: import _curses
In [2]: _curses.__file__
Out[2]: '/usr/lib/python2.7/lib-dynload/_curses.so'
K zacyklení není důvod, ty zavoláš "import curses", který načte obsah /usr/lib/python2.7/curses/__init__.py, kde se pouze jednou zavolá "from _curses import *". Teprve když zavoláš fci curses.initscr(), tak se v této fci zavolá "import _curses, curses", je to tam jen kvůli specifikaci jmeného prostotu. Modul _curses totiž také obsahuje fci initscr(), takže když jí chceš zavolat ve fci curses.initscr(), musíš uvést jednoznačnou specifikaci _curses.initscr(). Některé konstanty z C modulu jsou k dispozici až po zavolání fce _curses.initscr(), proto se udělala fce curses.initscr(), která zajistí předání těchto konstant i do modulu curses.
Význam "from _curses import *" je takový, že vše z modulu _curses budeš mít přístupné přes notaci curses.*, pokud nedojde k přetížení fce jako v případě initscr(), pak k této přetížené fci musíš přistupovat výše uvedeným způsobem.
Snad jsem se nikde nesekl, případně mě opravte.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.