1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
from rpython.rlib import types
def signature(*paramtypes, **kwargs):
"""Decorate a function to specify its type signature.
Usage:
@signature(param1type, param2type, ..., returns=returntype)
def foo(...)
The arguments paramNtype and returntype should be instances
of the classes in rpython.annotator.types.
"""
returntype = kwargs.pop('returns', None)
if returntype is None:
raise TypeError("signature: parameter 'returns' required")
def decorator(f):
f._signature_ = (paramtypes, returntype)
return f
return decorator
def finishsigs(cls):
"""Decorate a class to finish any method signatures involving types.self().
This is required if any method has a signature with types.self() in it.
"""
# A bit annoying to have to use this, but it avoids performing any
# terrible hack in the implementation. Eventually we'll offer signatures
# on classes, and then that decorator can do this on the side.
def fix(sigtype):
if isinstance(sigtype, types.SelfTypeMarker):
return types.instance(cls)
return sigtype
for attr in cls.__dict__.values():
if hasattr(attr, '_signature_'):
paramtypes, returntype = attr._signature_
attr._signature_ = (tuple(fix(t) for t in paramtypes), fix(returntype))
return cls
class FieldSpec(object):
def __init__(self, tp):
pass
class ClassSpec(object):
def __init__(self, fields, inherit=False):
pass
|