io — bemeneti/kimeneti adatfolyamok¶
Ez a modul a stream (fájlszerű) objektumok további típusait és segédfüggvényeket tartalmaz. Elérhetővé teszi a beépített open() függvényt, valamint a memóriában tárolt szöveges és bináris puffereket (StringIO, BytesIO), amelyek a szabványos read/write/seek adatfolyam-interfészt valósítják meg.
Fogalmi hierarchia¶
Eltérés a CPythontól
Az adatfolyam-alaposztályok fogalmi hierarchiája a MicroPythonban egyszerűsített, ahogy azt ez a szakasz ismerteti.
Az (absztrakt) adatfolyam-alaposztályok, amelyek az összes konkrét osztály viselkedésének alapját képezik, a CPythonban néhány dichotómiát (páronkénti osztályozást) követnek. A MicroPythonban ezek némileg egyszerűsítettek és implicitté váltak a nagyobb hatékonyság és az erőforrások megtakarítása érdekében.
A CPythonban fontos dichotómia a pufferelés nélküli és a pufferelt adatfolyamok közötti különbség. A MicroPythonban jelenleg minden adatfolyam pufferelés nélküli. Ennek oka, hogy minden modern operációs rendszer, sőt számos RTOS és fájlrendszer-illesztőprogram is már a maga oldalán végez pufferelést. Egy újabb pufferelési réteg hozzáadása kontraproduktív (ez a „bufferbloat” néven ismert probléma), és értékes memóriát foglal le. Vegye figyelembe, hogy vannak még olyan esetek, amikor a pufferelés hasznos lehet, ezért később bevezethetünk opcionális pufferelési támogatást.
A CPythonban azonban egy másik fontos dichotómia is kapcsolódik a „puffereltséghez” - mégpedig az, hogy egy adatfolyamon előfordulhatnak-e rövid olvasások/írások vagy sem. Rövid olvasásról akkor beszélünk, ha a felhasználó például 10 bájtot kér egy adatfolyamtól, de kevesebbet kap; ugyanez vonatkozik az írásokra is. A CPythonban a pufferelés nélküli adatfolyamok automatikusan ki vannak téve a rövid műveleteknek, míg a pufferelt adatfolyamok garantáltan védve vannak ellenük. A rövid olvasások/írások hiánya fontos tulajdonság, mivel lehetővé teszi tömörebb és hatékonyabb programok fejlesztését - ami a MicroPython esetében kifejezetten kívánatos. Így, bár a MicroPython nem támogatja a pufferelt adatfolyamokat, mégis biztosít rövid műveletek nélküli adatfolyamokat. Hogy lesznek-e rövid műveletek vagy sem, az az egyes osztályok igényeitől függ, de a fejlesztőknek erősen ajánljuk, hogy a fent ismertetett okok miatt a rövid műveletek nélküli viselkedést részesítsék előnyben. Például a MicroPython socketek garantáltan elkerülik a rövid olvasásokat/írásokat. Valójában jelenleg nincs példa rövid műveletes adatfolyam-osztályra a magban, és egy ilyen osztály egy adott hardverre lenne jellemző.
A rövid műveletek nélküli viselkedés bonyolulttá válik a nem blokkoló adatfolyamok esetén, ahol a blokkoló és a nem blokkoló viselkedés egy másik CPython-dichotómia, amelyet a MicroPython teljes mértékben támogat. A nem blokkoló adatfolyamok soha nem várnak az adatok megérkezésére vagy kiírására - annyit olvasnak/írnak, amennyit lehet, vagy jelzik az adatok (illetve az írási képesség) hiányát. Ez nyilvánvalóan ütközik a „rövid műveletek nélküli” szabállyal, és valóban, a nem blokkoló pufferelt (tehát rövid műveletek nélküli) adatfolyamok esete a CPythonban bonyolult - bizonyos helyeken az ilyen kombináció tiltott, máshol nem definiált vagy egyszerűen nem dokumentált, néhány esetben pedig részletes kivételeket vált ki. A MicroPythonban a dolog sokkal egyszerűbb: a nem blokkoló adatfolyamok fontosak a hatékony aszinkron műveletekhez, ezért ez a tulajdonság elsőbbséget élvez a „rövid műveletek nélkülivel” szemben. Így, míg a blokkoló adatfolyamok lehetőség szerint elkerülik a rövid olvasásokat/írásokat (rövid olvasás csak akkor fordulhat elő, ha a fájl végét éri el, vagy hiba esetén (de a hibák nem adnak vissza rövid adatot, hanem kivételeket váltanak ki)), a nem blokkoló adatfolyamok rövid adatot is előállíthatnak a művelet blokkolásának elkerülése érdekében.
Az utolsó dichotómia a bináris és a szöveges adatfolyamok közötti különbség. A MicroPython természetesen támogatja ezeket, de míg a CPythonban a szöveges adatfolyamok eredendően pufferelve vannak, a MicroPythonban nem. (Valóban, ez az egyik olyan eset, amely miatt bevezethetünk pufferelési támogatást.)
Vegye figyelembe, hogy a hatékonyság érdekében a MicroPython nem biztosít a fenti hierarchiának megfelelő absztrakt alaposztályokat, és nem lehetséges tiszta Pythonban adatfolyam-osztályt megvalósítani vagy abból leszármaztatni.
Függvények¶
Osztályok¶
- class io.IOBase¶
Az adatfolyam („fájlszerű”) objektumok alaposztálya. A konkrét alosztályok az alábbi alacsony szintű I/O-metódusokat (
readinto,write,ioctl) valósítják meg; a futtatókörnyezet ezekre építi a magasabb szintű adatfolyam-protokollt (read,readline,readlines,close, iteráció), így minden adatfolyam-példány támogatja ezeket a metódusokat akkor is, ha az alosztály nem definiálja őket.Megvalósítási metódusok (ezeket írja felül egy alosztályban):
- readinto(buf: bytearray) int | None¶
Bájtok beolvasása az írható buf pufferbe. Visszaadja a beolvasott bájtok számát, az adatfolyam végén
0-t, vagyNone-t, ha jelenleg nincs elérhető adat (nem blokkoló adatfolyam esetén).
- write(buf: bytes) int | None¶
A buf-ban lévő bájtok kiírása. Visszaadja a kiírt bájtok számát, vagy
None-t, ha az írás jelenleg nem hajtható végre (nem blokkoló adatfolyam esetén).
- ioctl(request: int, arg: int) int¶
Az alapul szolgáló adatfolyam/eszköz vezérlése. A request a
MP_STREAM_*kérelemkódok egyike. Sikeresség esetén nem negatív értéket, hiba esetén negatíverrnoértéket ad vissza.
Adatfolyam-protokoll metódusok (minden adatfolyam-példányon elérhetők):
- read(size: int = -1)¶
Legfeljebb size bájt (vagy szöveges módban karakter) beolvasása és visszaadása. Ha a size nincs megadva vagy negatív, az olvasás az adatfolyam végéig tart. Bináris adatfolyamoknál
bytes, szöveges adatfolyamoknálstrtípust ad vissza; az üres eredmény az adatfolyam végét jelzi.
- readline(size: int = -1)¶
Egy sor beolvasása és visszaadása, beleértve a záró újsor karaktert, ha van ilyen. Ha a size meg van adva, legfeljebb size bájt (vagy karakter) kerül beolvasásra. Az adatfolyam végén üres
bytes/strértéket ad vissza.
- readlines() list¶
Olvasás az adatfolyam végéig, és a sorok
listtípusú listájának visszaadása, mindegyik a záró újsorral együtt.
- close() None¶
Az adatfolyam lezárása és minden alapul szolgáló erőforrás felszabadítása. A lezárt adatfolyamon végzett műveletek
OSError(vagy a memóriában tárolt adatfolyamok eseténValueError) kivételt váltanak ki.
- seek(offset: int, whence: int = 0) int¶
Az aktuális adatfolyam-pozíció megváltoztatása a whence-hez viszonyított offset bájtra (
0= az adatfolyam eleje,1= aktuális pozíció,2= az adatfolyam vége). Visszaadja az új abszolút pozíciót. Olyan adatfolyamon, amely nem támogatja a pozicionálást,OSErrorkivételt vált ki.
- tell() int¶
Az adatfolyamon belüli aktuális abszolút pozíció visszaadása. Egyenértékű a
seek(0, 1)hívással.
- flush() None¶
Minden írási puffer kiürítése, a függőben lévő adatok kiküldése az alapul szolgáló eszközre vagy fájlba. Olyan adatfolyamokon, amelyek nem puffereinek, ez egy üres művelet.
Egy adatfolyam közvetlen iterálása iterációnként egy sort ad vissza – egyenértékű a
readline()ciklusban történő hívásával, amíg az üres sorral jelzett adatfolyam-vég jelzés vissza nem érkezik. Az adatfolyam a kontextuskezelő protokollt is támogatja, így awith open(...) as f:automatikusan lezárja az adatfolyamot.Megjegyzés
A MicroPython adatfolyam-modulja „1” utótaggal ellátott C-segédfüggvényeket is elérhetővé tesz (
mp_stream_read1_obj,mp_stream_readinto1_objésmp_stream_write1_obj), amelyek egyetlen alapul szolgáló I/O-hívást hajtanak végre ahelyett, hogy addig ciklusoznának, amíg a kérés teljesen ki nem szolgálódik. Ezeket belsőleg olyan osztályok használják, mint amachine.UART, hogy megvalósítsák sajátread/writeműveleteiket – de egyetlen szabványos adatfolyam-osztály sem köti hozzájuk Python-hívhatóread1/readinto1/write1metódusként.
- class io.StringIO(string: str = '')¶
Memóriában tárolt, fájlszerű objektum szöveges módú bemenethez/kimenethez (hasonló egy normál, „t” módosítóval megnyitott fájlhoz). A kezdeti tartalom a string paraméterrel adható meg (amelynek normál karakterláncnak kell lennie). A példányok a kontextuskezelő protokollt is támogatják (használhatók
withutasításban).- read(size: int = -1) str¶
Legfeljebb size karakter beolvasása és visszaadása. Ha a size nincs megadva vagy negatív, az összes hátralévő tartalom beolvasása és visszaadása.
- readline(size: int = -1) str¶
Egy sor beolvasása és visszaadása. Ha a size meg van adva, legfeljebb size karakter kerül beolvasásra.
- readinto(buf: bytearray) int¶
Olvasás az előre lefoglalt, írható buf pufferbe, és a beolvasott bájtok számának visszaadása.
- seek(offset: int, whence: int = 0) int¶
Az adatfolyam-pozíció megváltoztatása a whence-hez viszonyított offset-re (
0= eleje,1= aktuális,2= vége), és az új abszolút pozíció visszaadása.
- close() None¶
Az adatfolyam lezárása és az alapul szolgáló puffer felszabadítása. A lezárt adatfolyamon végzett további műveletek
ValueErrorkivételt váltanak ki.
- class io.StringIO(alloc_size: int)
Egy üres
StringIOobjektum létrehozása, amely előre le van foglalva legfeljebb alloc_size bájt tárolására, így legfeljebb ennyi bájt kiírása nem foglalja újra a puffert (elkerülve a memóriahiányt vagy a memóriatöredezettséget). Ez a konstruktor egy MicroPython-bővítmény, amely csak speciális esetekhez és rendszerszintű könyvtárakhoz ajánlott, végfelhasználói alkalmazásokhoz nem.Eltérés a CPythontól
Ez a konstruktor egy MicroPython-bővítmény.
- read(size: int = -1) str
Legfeljebb size karakter beolvasása és visszaadása. Ha a size nincs megadva vagy negatív, az összes hátralévő tartalom beolvasása és visszaadása.
- readline(size: int = -1) str
Egy sor beolvasása és visszaadása. Ha a size meg van adva, legfeljebb size karakter kerül beolvasásra.
- readinto(buf: bytearray) int
Olvasás az előre lefoglalt, írható buf pufferbe, és a beolvasott bájtok számának visszaadása.
- seek(offset: int, whence: int = 0) int
Az adatfolyam-pozíció megváltoztatása a whence-hez viszonyított offset-re (
0= eleje,1= aktuális,2= vége), és az új abszolút pozíció visszaadása.
- tell() int
Az aktuális adatfolyam-pozíció visszaadása.
- flush() None
Az írási pufferek kiürítése. Ez memóriában tárolt adatfolyam esetén egy üres művelet.
- close() None
Az adatfolyam lezárása és az alapul szolgáló puffer felszabadítása. A lezárt adatfolyamon végzett további műveletek
ValueErrorkivételt váltanak ki.
- getvalue() str
Az alapul szolgáló puffer aktuális tartalmának visszaadása.
- class io.BytesIO(string: bytes = b'')¶
Memóriában tárolt, fájlszerű objektum bináris módú bemenethez/kimenethez (hasonló egy normál, „b” módosítóval megnyitott fájlhoz). A kezdeti tartalom a string paraméterrel adható meg (amelynek bytes objektumnak kell lennie). A példányok a kontextuskezelő protokollt is támogatják (használhatók
withutasításban).- read(size: int = -1) bytes¶
Legfeljebb size bájt beolvasása és visszaadása. Ha a size nincs megadva vagy negatív, az összes hátralévő tartalom beolvasása és visszaadása.
- readline(size: int = -1) bytes¶
Egy sor beolvasása és visszaadása. Ha a size meg van adva, legfeljebb size bájt kerül beolvasásra.
- readinto(buf: bytearray) int¶
Olvasás az előre lefoglalt, írható buf pufferbe, és a beolvasott bájtok számának visszaadása.
- seek(offset: int, whence: int = 0) int¶
Az adatfolyam-pozíció megváltoztatása a whence-hez viszonyított offset-re (
0= eleje,1= aktuális,2= vége), és az új abszolút pozíció visszaadása.
- close() None¶
Az adatfolyam lezárása és az alapul szolgáló puffer felszabadítása. A lezárt adatfolyamon végzett további műveletek
ValueErrorkivételt váltanak ki.
- class io.BytesIO(alloc_size: int)
Egy üres
BytesIOobjektum létrehozása, amely előre le van foglalva legfeljebb alloc_size bájt tárolására, így legfeljebb ennyi bájt kiírása nem foglalja újra a puffert (elkerülve a memóriahiányt vagy a memóriatöredezettséget). Ez a konstruktor egy MicroPython-bővítmény, amely csak speciális esetekhez és rendszerszintű könyvtárakhoz ajánlott, végfelhasználói alkalmazásokhoz nem.Eltérés a CPythontól
Ez a konstruktor egy MicroPython-bővítmény.
- read(size: int = -1) bytes
Legfeljebb size bájt beolvasása és visszaadása. Ha a size nincs megadva vagy negatív, az összes hátralévő tartalom beolvasása és visszaadása.
- readline(size: int = -1) bytes
Egy sor beolvasása és visszaadása. Ha a size meg van adva, legfeljebb size bájt kerül beolvasásra.
- readinto(buf: bytearray) int
Olvasás az előre lefoglalt, írható buf pufferbe, és a beolvasott bájtok számának visszaadása.
- seek(offset: int, whence: int = 0) int
Az adatfolyam-pozíció megváltoztatása a whence-hez viszonyított offset-re (
0= eleje,1= aktuális,2= vége), és az új abszolút pozíció visszaadása.
- tell() int
Az aktuális adatfolyam-pozíció visszaadása.
- flush() None
Az írási pufferek kiürítése. Ez memóriában tárolt adatfolyam esetén egy üres művelet.
- close() None
Az adatfolyam lezárása és az alapul szolgáló puffer felszabadítása. A lezárt adatfolyamon végzett további műveletek
ValueErrorkivételt váltanak ki.
- getvalue() bytes
Az alapul szolgáló puffer aktuális tartalmának visszaadása.