inspect.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. class _empty:
  2. pass
  3. class Parameter:
  4. POSITIONAL_ONLY = 0
  5. POSITIONAL_OR_KEYWORD = 1
  6. VAR_POSITIONAL = 2
  7. KEYWORD_ONLY = 3
  8. VAR_KEYWORD = 4
  9. empty = _empty
  10. def __init__(self, name, kind, *default):
  11. self.name = name
  12. self.kind = kind
  13. # pocketpy only allows literal defaults, so use *default as sentinel
  14. self.default = default[0] if default else _empty
  15. def __str__(self):
  16. res = self.name
  17. if self.default is not _empty:
  18. res += '=' + repr(self.default)
  19. if self.kind == Parameter.VAR_POSITIONAL:
  20. res = '*' + res
  21. elif self.kind == Parameter.VAR_KEYWORD:
  22. res = '**' + res
  23. return res
  24. def __repr__(self):
  25. return '<Parameter "' + str(self) + '">'
  26. class Signature:
  27. empty = _empty
  28. def __init__(self, parameters):
  29. self.parameters = {p.name: p for p in parameters}
  30. def __str__(self):
  31. return '(' + ', '.join([str(p) for p in self.parameters.values()]) + ')'
  32. def __repr__(self):
  33. return '<Signature ' + str(self) + '>'
  34. def _make_params(func):
  35. return [Parameter(*entry) for entry in _signature_data(func)]
  36. def signature(obj):
  37. if not callable(obj):
  38. raise TypeError(repr(obj) + ' is not a callable object')
  39. if isinstance(obj, type):
  40. return Signature(_make_params(obj.__init__)[1:])
  41. if hasattr(obj, '__func__'):
  42. return Signature(_make_params(obj.__func__)[1:])
  43. return Signature(_make_params(obj))