typing.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. def main():
  2. import importlib.abc
  3. import importlib.machinery
  4. import sys
  5. class Finder(importlib.abc.MetaPathFinder):
  6. def find_spec(self, fullname, path, target=None):
  7. if fullname in sys.builtin_module_names:
  8. return importlib.machinery.ModuleSpec(
  9. fullname,
  10. importlib.machinery.BuiltinImporter,
  11. )
  12. sys.meta_path.append(Finder())
  13. try:
  14. import yandex.type_info.type_base as ti_base
  15. import yandex.type_info.typing as ti_typing
  16. import six
  17. except ImportError as e:
  18. raise ImportError(
  19. str(e) + ". Make sure that library/python/type_info is in your PEERDIR list"
  20. )
  21. from yql import typing
  22. AutoMap = ti_base.make_primitive_type("AutoMap")
  23. def _format_arg(arg):
  24. res = []
  25. if arg[0]:
  26. res.append("{}:".format(ti_base.quote_string(arg[0])))
  27. res.append(str(arg[1]))
  28. if arg[2]:
  29. res.append("{Flags:")
  30. res.append(",".join(str(x) for x in sorted(list(arg[2]))))
  31. res.append("}")
  32. return "".join(res)
  33. Stream = ti_typing._SingleArgumentGeneric("Stream")
  34. @six.python_2_unicode_compatible
  35. class GenericResourceAlias(ti_base.Type):
  36. REQUIRED_ATTRS = ti_base.Type.REQUIRED_ATTRS + ["tag"]
  37. def __str__(self):
  38. return u"{}<{}>".format(self.name, ti_base.quote_string(self.tag))
  39. def to_yson_type(self):
  40. return {"type_name": self.yt_type_name, "tag": self.tag}
  41. class GenericResource(ti_base.Generic):
  42. def __getitem__(self, params):
  43. if not isinstance(params, str):
  44. raise ValueError("Expected str, but got: {}".format(ti_base._with_type(params)))
  45. attrs = {
  46. "name": self.name,
  47. "yt_type_name": self.yt_type_name,
  48. "tag": params,
  49. }
  50. return GenericResourceAlias(attrs)
  51. def from_dict(self):
  52. raise NotImplementedError()
  53. Resource = GenericResource("Resource")
  54. def _extract_arg_info(param):
  55. name = ""
  56. arg_type = param
  57. flags = set()
  58. if isinstance(param, slice):
  59. name = param.start
  60. if name is None:
  61. name = ""
  62. if not isinstance(name, str):
  63. raise ValueError("Expected str as argument name but got: {}".format(ti_base._with_type(name)))
  64. arg_type = param.stop
  65. ti_base.validate_type(arg_type)
  66. if param.step is not None:
  67. for x in param.step:
  68. if x != AutoMap:
  69. raise ValueError("Expected AutoMap as parameter flag but got: {}".format(ti_base._with_type(x)))
  70. flags.add(x)
  71. else:
  72. ti_base.validate_type(arg_type)
  73. return (name, arg_type, flags)
  74. @six.python_2_unicode_compatible
  75. class GenericCallableAlias(ti_base.Type):
  76. def __str__(self):
  77. return ("Callable<(" +
  78. ",".join(_format_arg(x) for x in self.args[:len(self.args)-self.optional_args]) +
  79. ("," if len(self.args) > self.optional_args and self.optional_args else "") +
  80. ("[" if self.optional_args else "") +
  81. ",".join(_format_arg(x) for x in self.args[len(self.args)-self.optional_args:]) +
  82. ("]" if self.optional_args else "") +
  83. ")->" + str(getattr(self, "return")) + ">")
  84. def to_yson_type(self):
  85. yson_repr = {
  86. "optional_args": self.optional_args,
  87. "return": getattr(self, "return"),
  88. "args": self.args,
  89. "type_name": self.yt_type_name,
  90. }
  91. return yson_repr
  92. class GenericCallable(ti_base.Generic):
  93. def __getitem__(self, params):
  94. if not isinstance(params, tuple) or len(params) < 2 or not isinstance(params[0], int) or not ti_typing.is_valid_type(params[1]):
  95. raise ValueError("Expected at least two arguments (integer and type of return value) but got: {}".format(ti_base._with_type(params)))
  96. args = []
  97. for param in params[2:]:
  98. name, arg_type, flags = _extract_arg_info(param)
  99. args.append((name, arg_type, flags))
  100. if params[0] < 0 or params[0] > len(args):
  101. raise ValueError("Optional argument count - " + str(params[0]) + " out of range [0.." + str(len(args)) + "]")
  102. attrs = {
  103. "optional_args": params[0],
  104. "return": params[1],
  105. "args": args,
  106. "name": "Tagged",
  107. "yt_type_name": "tagged",
  108. }
  109. return GenericCallableAlias(attrs)
  110. def from_dict(self):
  111. raise NotImplementedError()
  112. Callable = GenericCallable("Callable")
  113. def parse_slice_arg(arg):
  114. try:
  115. return _format_arg(_extract_arg_info(arg))
  116. except ValueError:
  117. pass
  118. typing.Type = ti_base.Type
  119. typing.is_valid_type = ti_base.is_valid_type
  120. typing.parse_slice_arg = parse_slice_arg
  121. typing.Bool = ti_typing.Bool
  122. typing.Int8 = ti_typing.Int8
  123. typing.Uint8 = ti_typing.Uint8
  124. typing.Int16 = ti_typing.Int16
  125. typing.Uint16 = ti_typing.Uint16
  126. typing.Int32 = ti_typing.Int32
  127. typing.Uint32 = ti_typing.Uint32
  128. typing.Int64 = ti_typing.Int64
  129. typing.Uint64 = ti_typing.Uint64
  130. typing.Float = ti_typing.Float
  131. typing.Double = ti_typing.Double
  132. typing.String = ti_typing.String
  133. typing.Utf8 = ti_typing.Utf8
  134. typing.Yson = ti_typing.Yson
  135. typing.Json = ti_typing.Json
  136. typing.Uuid = ti_typing.Uuid
  137. typing.Date = ti_typing.Date
  138. typing.Datetime = ti_typing.Datetime
  139. typing.Timestamp = ti_typing.Timestamp
  140. typing.Interval = ti_typing.Interval
  141. typing.TzDate = ti_typing.TzDate
  142. typing.TzDatetime = ti_typing.TzDatetime
  143. typing.TzTimestamp = ti_typing.TzTimestamp
  144. typing.Void = ti_typing.Void
  145. typing.Null = ti_typing.Null
  146. typing.EmptyTuple = ti_typing.EmptyTuple
  147. typing.EmptyStruct = ti_typing.EmptyStruct
  148. typing.Optional = ti_typing.Optional
  149. typing.List = ti_typing.List
  150. typing.Dict = ti_typing.Dict
  151. typing.Tuple = ti_typing.Tuple
  152. typing.Struct = ti_typing.Struct
  153. typing.Variant = ti_typing.Variant
  154. typing.Tagged = ti_typing.Tagged
  155. typing.Decimal = ti_typing.Decimal
  156. typing.Stream = Stream
  157. typing.Resource = Resource
  158. typing.Callable = Callable
  159. typing.AutoMap = AutoMap