Společnost PINE64 stojící za telefony PinePhone a PinePhone Pro nebo notebooky Pinebook a Pinebook Pro publikovala na svém blogu březnový souhrn novinek (YouTube). Jednodeskový RISC-V počítač Star64 s SoC StarFive JH-7110 bude v prodeji od 4. dubna.
Open source modální textový editor Helix, inspirovaný editory Vim, Neovim či Kakoune, byl vydán ve verzi 23.03. Přehled novinek v oznámení na webu a v CHANGELOGu na GitHubu.
Je tu opět apríl. Společnost Razer představila holící myš Razer Razer. Vědci z CERNu navrhují 25hodinový den. Společnost Elgato představila kolekci Elgato Home. Společnost Nothing Beer (5.1%). Další aprílové novinky například na April Fools' Day On The Web.
Před 25 lety byl uvolněn zdrojový kód balíku aplikací Netscape Communicator jako open source (např. dobová zpráva CNET), z čehož vzešel projekt Mozilla – ten si výročí nyní připomíná.
Na GOG.com běží Spring Sale. Při té příležitosti lze získat zdarma počítačovou hru Deep Sky Derelicts.
Sound Open Firmware, projekt Linux Foundation, open source audio DSP firmware a SDK, byl vydán ve verzi 2.5.0. Přináší podporu platformy Mediatek mt8188 nebo nový audio modul ARIA (Automatic Regressive Input Amplifier Module).
Byla vydána nová verze 5.8 programovacího jazyka Swift (Wikipedie). Zdrojové kódy jsou k dispozici na GitHubu. Ke stažení budou oficiální binární balíčky pro Ubuntu 18.04, Ubuntu 20.04, Ubuntu 22.04, CentOS 7, Amazon Linux 2 a Red Hat Universal Base Image 9.
Byla vydána nová verze 1.77 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.77 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Byla vydána beta verze Ubuntu 23.04 s kódovým názvem Lunar Lobster. Přehled novinek v poznámkách k vydání. Dle plánu by Ubuntu 23.04 mělo vyjít 20. dubna 2023.
Linuxová distribuce OpenMandriva byla vydána ve verzi ROME 23.03. Název ROME říká, že se jedná se o průběžně aktualizovanou (rolling) edici. Stabilní edice nese název Rock, aktuálně OpenMandriva Lx 4.3 Dysprosium.
#!/usr/bin/python #http://www.networksorcery.com/enp/protocol/irc.htm import re import socket import getpass class IRCBotInterface(object): """Generic interface for working with IRC messages.""" def read(self): raise NotImplemented def write(self, msg): raise NotImplemented def open(self): raise NotImplemented def close(self): raise NotImplemented class IRCBotShellInterface(IRCBotInterface): def __init__(self): pass def read(self): return raw_input("> ") def write(self, msg): print msg def open(self): pass def close(self): pass class IRCBotTelnetInterface(IRCBotInterface): def __init__(self, address = None, port = 8080): self._timeout = 60 * 10 self._listen = None self._sfile = None self._socket = None self._addr = address self._port = port def client(self): return self._sfile def disconnected(self): self._socket = None self._sfile = None def read(self): pass def write(self, msg): pass def open(self): pass if self._listen == None: raise Exception("No valid address found") def close(self): pass if __name__ == "__main__": x = IRCBotTelnetInterface("::1", 8082) x.open() while True: data = x.read() if data == "": break print "Received:", data x.write(data)Se samotnym sitovym programovanim az takovy problem nemam, ale moc nechapu jak naimplementovat to rozhrani pro komunikaci (shell). Nevim, k cemu jsou zapotrebi dve tridy IRCBotInterface(object) a IRCBotShellInterface(IRCBotInterface). Je mi jasny, ze IRCBotShellInterface(IRCBotInterface) dedi predchozi tridu IRCBotInterface, jennevim proc.Premyslim, v cem se maji jejich metody lisit. Nejsem zbehly v OOP, vlastne zacinam, takze mi asi neco podstatnyho nedochazi. Ma snad prvni trida byt I/O rozhrani a druha trida rozhrani pro komunikaci se servrem? Ale co potom fce open a close? As jsem spravne pochopil, ze perace otevreni socketu ma delat fce open. V cem se maji v jednotlivych tridach ale lisit? Mohl bych pozadat o nejake nakopnuti? Vubec nevim, od ceho se mam odpichnout. Moc instrukci jsme k ukolu nedostali a me moc nedochazi, jakym zpusobem to rozhrani ma fungovat.
Řešení dotazu:
#!/usr/bin/env python import socket host = '' port = 50000 backlog = 5 size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((host,port)) s.listen(backlog) while 1: client, address = s.accept() data = client.recv(size) if data: client.send(data) client.close()
…nektere si muze redefinovatTo co popisujes je proste dedeni a ne abstraktni predek. "Abstraktni" trida se tak jmenuje proto ze fyzicky nemuze existovat - kdyz se ji pokusis instanciovat tak te kompiler vyfakuje. Metody mit teoreticky muze, prakticky to ale vetsinou nema smysl a treba javovske interfacy to ani nedovoluji. Pythonisticky pristup je duck-typing neboli "kdyz to kvaka jako kacena, tak to asi bude kacena" a mas ho v ruce pokazde kdyz zavolas open
Metody mit teoreticky muze, prakticky to ale vetsinou nema smysl a treba javovske interfacy to ani nedovoluji.Kdes' toto vzal? Abstraktní třídy s metodami i datovými členy jsou běžné, mají smysl a není na nich nic špatného. Interface je něco jiného než abstraktní třída; existuje normálně pouze ve statických objektových systémech bez vícenásobné dědičnosti, kterou supluje.
pass?
class IRCBotInterface(object): """Generic interface for working with IRC messages.""" def read(self): raise NotImplemented #########dalsi metody########## class IRCBotShellInterface(IRCBotInterface): def __init__(self): pass def read(self): try: super().read(self) except NotImplementedError: pass return raw_input("> ")Ale pri spusteni mi to nadava porad:
raise NotImplemented TypeError: exceptions must be old-style classes or derived from BaseException, not NotImplementedTypeNevite nekdo co s tim?
NotImplemented
je hodnota typu NotImplementedType
, která se dá vracet třeba return
, ale ne vyhazovat jako vyjímka. Ta se totiž jmenuje NotImplementedError
. Mimochodem, vracet lze i vyjímka a je to naprosto korektní obrat.
>>> def foo(): return NotImplemented >>> x = foo >>> x == None False >>> x == NotImplemented True >>> def bar(): raise NotImplementedError() >>> y = bar() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in bar NotImplementedError >>> def ham(): return NotImplementedError >>> z = ham() >>> z == NotImplemented False >>> z == NotImplementedError True >>> raise z('aaa') Traceback (most recent call last): File "<stdin>", line 1, in <module> NotImplementedError: aaa
Zajimalo by me, co s tema not implemented vyjimkama? nebylo by jednodussi to v te abstraktni tride zmenit na
pass
?
Předpokládám že ve skutečnosti tam má být NotImplementedError
, viz níže.
Česky ta výjimka znamená "vole, zapoměl jsi implementovat tuhle metodu, koukej ji dodělat. šupem.". To je právě ten jemný rozdíl mezi abstraktní třídou která popisuje rozhraní, a nějakou tvojí třídou která to rozhraní skutečně implementuje. Ve staticky kompilovaném jazyce prostě jen napíšeš jméno metody a označíš jí jako abstraktní a kompiler to bere tak že nějaký potomek tu metodu přetíží a dodá potřebnou funkčnost. Čili v hotovým kódu taková metoda fakticky neexistuje, je to jen dodatečná informace pro kompiler aby tě zjebal když na to při psaní potomka zapomeneš.
Jenže. V pythonu není žádná "kompilace" takže není (jednoduchý) způsob jak něco takového vynutit. Takže se to hákuje tak že se udělá skutečná, existující metoda, ale implementace uvnitř je jen pahýl který vždy vystřelí výjimku. Může to být jakákoliv výjimka, ale je taková praxe že se střílí NotImplementedError. Drobný, ale zásadní rozdíl je, že ta výjimka vystřelí až v okamžiku kdy ten kód běží. Když by ta zapomenutá metoda byla v nějaké nepoužívané větvi kódu tak na to vůbec nemusíš přijít, což tak nějak popírá důvod proč se s tím vůbec matlat.
Tiskni
Sdílej: