Shery és RePa

2008. július 25.

Py3k snippets – typecheck

dyuri @ 16:33:48

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!

Címkék:,

Comments are closed.

Ez egy blog. A velemenyunk a mienk, ezert szubjektiv, es meglehet, hogy neha csak picit fedi az egyetemes igazsagot. Mellesleg akinek nem tetszik, az nezze helyette a tvt.

Egyebkent nyugodtan lehet idezni, kepeket toltogetni, szabadok vagyunk.

Ha esetleg valami szemelyes kozolnivalod van, amit nem szeretnel kommentbe leirni, akkor tobbek kozott elerhetsz minket a [akiacikketirta] kukac horak pont hu emailcimen.