Portál AbcLinuxu, 12. května 2025 04:25

Dotaz: Objasnění kódu v Curses

18.6.2015 11:50 Curses
Objasnění kódu v Curses
Přečteno: 223×
Odpovědět | Admin
Ahoj, měl bych tři dotazy ohledné tohoto kódu ?

Když načtu curses kdekoli v mém kódu
import curses
tak se bude načítat tento soubor
/usr/lib/python3.4/curses/__init__.py
jenž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, curses
Jelikož umím jen PHP tak mi není jasné, proč volá soubor
/usr/lib/python3.4/curses/__init__.py
zase 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
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

xxxxxx avatar 18.6.2015 14:12 xxxxxx | skóre: 23
Rozbalit Rozbalit vše Re: Objasnění kódu v Curses
Odpovědět | | Sbalit | Link | Blokovat | Admin
S tím mnohonásobným importem - modul se importuje jen poprvé link

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.
Fuky avatar 18.6.2015 14:59 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Objasnění kódu v Curses
Odpovědět | | Sbalit | Link | Blokovat | Admin

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.

-- RÁMO: psí tábor , ETriatlon: Výuka plavání

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.