Py3k snippets – typecheck
A python 3.0-ban jelennek meg a függvény argumentum megjegyzések (annotations, nemtom minek lehetne értelmesen fordítani), ami amellett, hogy dokumentációs célokat szolgál, segítségével megvalósítható python alatt is a függvény paraméterek típusellenőrzése (mert az egyébként nincs).
Maga az ellenőrzés nem lesz része a python 3.0-nak, és mindenhol azt írják, hogy egyszerű megcsinálni, de mivel sehol sem találtam meg, ezért megcsináltam magam. És valóban, egy egyszerű dekorátor függvény teszi, ami nekünk kell:
import inspect def typecheck(func): def inner(*args, **kwargs): # check *args valueiter = iter(func.__annotations__.values()) for arg in args: argclass = next(valueiter) if not inspect.isclass(argclass): continue if not issubclass(arg.__class__, argclass): raise TypeError("Hibas bejovo parameter!") # check **kwargs for arg in kwargs: if not arg in func.__annotations__ or not inspect.isclass(func.__annotations__[arg]): continue if not issubclass(kwargs[arg].__class__, func.__annotations__[arg]): raise TypeError("Hibas bejovo parameter!") # call the function return func(*args, **kwargs) return inner
Nézzük működés közben:
@typecheck def a(alma: int, beka: str = "szia", mokus: int = 2): print(alma, beka, mokus) >>> a(1, mokus=10) 1 szia 10 >>> a(1, mokus=10, beka=3) Traceback (most recent call last): File "stdin", line 1, in module File "stdin", line 16, in inner TypeError: Hibas bejovo parameter! >>> a(1, beka="hello") 1 hello 2
Persze ez csak egy gyors megoldás, érdemes lenne a hibaüzenetben kiírni, hogy melyik paraméter hibás, ezt az érdeklődők megírhatják kommentben.
Pythonra fel!