====== Python ====== * hlavička má být něco takového #!/usr/bin/env python ===== Funkce ===== * funkce s parametry # Příklad funkce s return annotation (říká, co by to vracet mělo) def add(first, second) -> int: return first+second # Volání funkce add(5,10) * default hodnoty parametru a specifikování typu def add(first: int = 5, second: int = 10) -> int: return first+second add() add(second=6) * anonymní funkce # Uložení reference na funkci add = lambda first, second: first+second # Volání funkce add(5,10) # Definice a přímé použití (lambda first, second: first+second)(5,10) ===== OOP ===== * třída se definuje klíčovým slovem ''Class'' * metody třídy se zapisují jako normální funkce * Python nepodporuje privátní proměnné, symbolicky se zapisuje podržítkem na začátku * klíčové slovo ''self'' odkazuje na sebe sama class MyClass(): # Konstruktor def __init__(self): self._count = 0 # Metoda tridy @classmethod def add(number): _count += number # Ekvivalentni zapis bez pouziti dekoratoru ''' def add(self,number): self._count += number ''' # Getter pomoci dekorátoru @property def count(): return self._count * dědičná třída se zapisuje class MyClass(MyParentClass): def __init__(self): super.__init__() * klíčové slovo ''super'' referencuje nadřazenou třídu * Vlastní vyjímky se vytváří z třídy Exception * Klíčové slovo ''pass'' pouze informuje, že se má pokračovat. * U prázdné třídy/funkce se musí použít, jinak by to hlásilo chybu, že třída nemá žádnou definici. class MyException(Exception): pass ===== Scapy ===== * odeslání jednoduchého paketu ([[https://thepacketgeek.com/scapy-p-05-sending-our-first-packet-arp-response|zdroj]]) from scapy.all import * pkt = Ether()/IP() // vytvoří objekt, dvě vrstvy: Ethernet, TCP pkt[Ether].src = my_mac pkt[Ether].dst = "ff:ff:ff:ff:ff:ff" pkt[IP].src = "192.168.1.100" pkt[IP].dst = "192.168.1.255" sendp(pkt) * scapy má i přímo cli, pro jednoduší zkoušení * užitečný příkaz je ls, který vypíše informace o možných položkách >>> ls(Ether) dst : DestMACField = (None) src : SourceMACField = (None) type : XShortEnumField = (0) * příklad vytvoření pcap s VLAN tagem mypkt2=Ether()/Dot1Q(vlan=42)/IP(dst="1.2.3.4")/Raw("example") sendp(mypkt2, iface="eth0") ===== setuptools (setup.py) ===== * vytvoření rpm ([[http://jeromebelleman.gitlab.io/posts/devops/setuppy/|zdroj]]) python setup.py bdist_rpm * vyrvoření whl ([[https://www.realpythonproject.com/how-to-create-a-wheel-file-for-your-python-package-and-import-it-in-another-project/|zdroj]]) python setup.py bdist_wheel * whl by se už nemělo vytvářet přes setup.py, jde o deprecated volbu * mělo by být nahrazeno: pip wheel . * nebo python -m build --wheel * který čte pyproject.toml, připadně setup.py, pokud první neexistuje