Robot Framework
typeconverters.py
Go to the documentation of this file.
1 # Copyright 2008-2015 Nokia Networks
2 # Copyright 2016- Robot Framework Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 from ast import literal_eval
17 from collections import OrderedDict
18 from collections.abc import ByteString, Container, Mapping, Sequence, Set
19 from typing import Any, Tuple, TypeVar, Union
20 from datetime import datetime, date, timedelta
21 from decimal import InvalidOperation, Decimal
22 from enum import Enum
23 from numbers import Integral, Real
24 from os import PathLike
25 from pathlib import Path, PurePath
26 
27 from robot.conf import Languages
28 from robot.libraries.DateTime import convert_date, convert_time
29 from robot.utils import (eq, get_error_message, is_string, is_union, plural_or_not as s,
30  safe_str, seq2str, type_name, type_repr, typeddict_types)
31 
32 
33 NoneType = type(None)
34 
35 
37  type = None
38  type_name = None
39  abc = None
40  aliases = ()
41  value_types = (str,)
42  doc = None
43 
46  _converters = OrderedDict()
47 
50  _type_aliases = {}
51 
52  def __init__(self, used_type, custom_converters=None, languages=None):
53  self.used_typeused_type = used_type
54  self.custom_converterscustom_converters = custom_converters
55  self.languageslanguages = languages or Languages()
56 
57  @classmethod
58  def register(cls, converter):
59  cls._converters_converters[converter.type] = converter
60  for name in (converter.type_name,) + converter.aliases:
61  if name is not None and not isinstance(name, property):
62  cls._type_aliases_type_aliases[name.lower()] = converter.type
63  return converter
64 
65  @classmethod
66  def converter_for(cls, type_, custom_converters=None, languages=None):
67  try:
68  hash(type_)
69  except TypeError:
70  return None
71  if isinstance(type_, str):
72  try:
73  type_ = cls._type_aliases_type_aliases[type_.lower()]
74  except KeyError:
75  return None
76  used_type = type_
77  if getattr(type_, '__origin__', None) and type_.__origin__ is not Union:
78  type_ = type_.__origin__
79  if custom_converters:
80  info = custom_converters.get_converter_info(type_)
81  if info:
82  return CustomConverter(used_type, info)
83  if type_ in cls._converters_converters:
84  return cls._converters_converters[type_](used_type, custom_converters, languages)
85  for converter in cls._converters_converters.values():
86  if converter.handles(type_):
87  return converter(used_type, custom_converters, languages)
88  return None
89 
90  @classmethod
91  def handles(cls, type_):
92  handled = (cls.typetype, cls.abcabc) if cls.abcabc else cls.typetype
93  return isinstance(type_, type) and issubclass(type_, handled)
94 
95  def convert(self, name, value, explicit_type=True, strict=True, kind='Argument'):
96  if self.no_conversion_neededno_conversion_needed(value):
97  return value
98  if not self._handles_value_handles_value(value):
99  return self._handle_error_handle_error(name, value, kind, strict=strict)
100  try:
101  if not isinstance(value, str):
102  return self._non_string_convert_non_string_convert(value, explicit_type)
103  return self._convert_convert(value, explicit_type)
104  except ValueError as error:
105  return self._handle_error_handle_error(name, value, kind, error, strict)
106 
107  def no_conversion_needed(self, value):
108  try:
109  return isinstance(value, self.used_typeused_type)
110  except TypeError:
111  # If the used type doesn't like `isinstance` (e.g. TypedDict),
112  # compare the value to the generic type instead.
113  if self.typetype and self.typetype is not self.used_typeused_type:
114  return isinstance(value, self.typetype)
115  raise
116 
117  def _handles_value(self, value):
118  return isinstance(value, self.value_typesvalue_types)
119 
120  def _non_string_convert(self, value, explicit_type=True):
121  return self._convert_convert(value, explicit_type)
122 
123  def _convert(self, value, explicit_type=True):
124  raise NotImplementedError
125 
126  def _handle_error(self, name, value, kind, error=None, strict=True):
127  if not strict:
128  return value
129  value_type = '' if isinstance(value, str) else f' ({type_name(value)})'
130  value = safe_str(value)
131  ending = f': {error}' if (error and error.args) else '.'
132  if name is None:
133  raise ValueError(
134  f"{kind} '{value}'{value_type} "
135  f"cannot be converted to {self.type_name}{ending}"
136  )
137  raise ValueError(
138  f"{kind} '{name}' got value '{value}'{value_type} that "
139  f"cannot be converted to {self.type_name}{ending}"
140  )
141 
142  def _literal_eval(self, value, expected):
143  if expected is set and value == 'set()':
144  # `ast.literal_eval` has no way to define an empty set.
145  return set()
146  try:
147  value = literal_eval(value)
148  except (ValueError, SyntaxError):
149  # Original errors aren't too informative in these cases.
150  raise ValueError('Invalid expression.')
151  except TypeError as err:
152  raise ValueError(f'Evaluating expression failed: {err}')
153  if not isinstance(value, expected):
154  raise ValueError(f'Value is {type_name(value)}, not {expected.__name__}.')
155  return value
156 
157  def _get_nested_types(self, type_hint, expected_count=None):
158  types = getattr(type_hint, '__args__', ())
159  # With generics from typing like Dict, __args__ is None with Python 3.6 and
160  # contains TypeVars with 3.7-3.8. Newer versions don't have __args__ at all.
161  # Subscripted usages like Dict[x, y].__args__ work fine with all.
162  if not types or all(isinstance(a, TypeVar) for a in types):
163  return ()
164  if expected_count and len(types) != expected_count:
165  raise TypeError(f'{type_hint.__name__}[] construct used as a type hint '
166  f'requires exactly {expected_count} nested '
167  f'type{s(expected_count)}, got {len(types)}.')
168  return types
169 
170  def _remove_number_separators(self, value):
171  if is_string(value):
172  for sep in ' ', '_':
173  if sep in value:
174  value = value.replace(sep, '')
175  return value
176 
177 
178 @TypeConverter.register
180  type = Enum
181 
182  @property
183  type_name = property
184 
185  def type_name(self):
186  return self.used_typeused_type.__name__
187 
188  @property
189  value_types = property
190 
191  def value_types(self):
192  return (str, int) if issubclass(self.used_typeused_type, int) else (str,)
193 
194  def _convert(self, value, explicit_type=True):
195  enum = self.used_typeused_type
196  if isinstance(value, int):
197  return self._find_by_int_value_find_by_int_value(enum, value)
198  try:
199  return enum[value]
200  except KeyError:
201  return self._find_by_normalized_name_or_int_value_find_by_normalized_name_or_int_value(enum, value)
202 
204  members = sorted(enum.__members__)
205  matches = [m for m in members if eq(m, value, ignore='_')]
206  if len(matches) == 1:
207  return getattr(enum, matches[0])
208  if len(matches) > 1:
209  raise ValueError(f"{self.type_name} has multiple members matching "
210  f"'{value}'. Available: {seq2str(matches)}")
211  try:
212  if issubclass(self.used_typeused_type, int):
213  return self._find_by_int_value_find_by_int_value(enum, value)
214  except ValueError:
215  members = [f'{m} ({getattr(enum, m)})' for m in members]
216  raise ValueError(f"{self.type_name} does not have member '{value}'. "
217  f"Available: {seq2str(members)}")
218 
219  def _find_by_int_value(self, enum, value):
220  value = int(value)
221  for member in enum:
222  if member.value == value:
223  return member
224  values = sorted(member.value for member in enum)
225  raise ValueError(f"{self.type_name} does not have value '{value}'. "
226  f"Available: {seq2str(values)}")
227 
228 
229 @TypeConverter.register
231  type = str
232  type_name = 'string'
233  aliases = ('string', 'str', 'unicode')
234  value_types = (Any,)
235 
236  def _handles_value(self, value):
237  return True
238 
239  def _convert(self, value, explicit_type=True):
240  if not explicit_type:
241  return value
242  try:
243  return str(value)
244  except Exception:
245  raise ValueError(get_error_message())
246 
247 
248 @TypeConverter.register
250  type = bool
251  type_name = 'boolean'
252  aliases = ('bool',)
253  value_types = (str, int, float, NoneType)
254 
255  def _non_string_convert(self, value, explicit_type=True):
256  return value
257 
258  def _convert(self, value, explicit_type=True):
259  normalized = value.title()
260  if normalized == 'None':
261  return None
262  if normalized in self.languageslanguages.true_strings:
263  return True
264  if normalized in self.languageslanguages.false_strings:
265  return False
266  return value
267 
268 
269 @TypeConverter.register
271  type = int
272  abc = Integral
273  type_name = 'integer'
274  aliases = ('int', 'long')
275  value_types = (str, float)
276 
277  def _non_string_convert(self, value, explicit_type=True):
278  if value.is_integer():
279  return int(value)
280  raise ValueError('Conversion would lose precision.')
281 
282  def _convert(self, value, explicit_type=True):
283  value = self._remove_number_separators_remove_number_separators(value)
284  value, base = self._get_base_get_base(value)
285  try:
286  return int(value, base)
287  except ValueError:
288  if base == 10 and not explicit_type:
289  try:
290  return float(value)
291  except ValueError:
292  pass
293  raise ValueError
294 
295  def _get_base(self, value):
296  value = value.lower()
297  for prefix, base in [('0x', 16), ('0o', 8), ('0b', 2)]:
298  if prefix in value:
299  parts = value.split(prefix)
300  if len(parts) == 2 and parts[0] in ('', '-', '+'):
301  return ''.join(parts), base
302  return value, 10
303 
304 
305 @TypeConverter.register
307  type = float
308  abc = Real
309  type_name = 'float'
310  aliases = ('double',)
311  value_types = (str, Real)
312 
313  def _convert(self, value, explicit_type=True):
314  try:
315  return float(self._remove_number_separators_remove_number_separators(value))
316  except ValueError:
317  raise ValueError
318 
319 
320 @TypeConverter.register
322  type = Decimal
323  type_name = 'decimal'
324  value_types = (str, int, float)
325 
326  def _convert(self, value, explicit_type=True):
327  try:
328  return Decimal(self._remove_number_separators_remove_number_separators(value))
329  except InvalidOperation:
330  # With Python 3 error messages by decimal module are not very
331  # useful and cannot be included in our error messages:
332  # https://bugs.python.org/issue26208
333  raise ValueError
334 
335 
336 @TypeConverter.register
338  type = bytes
339  abc = ByteString
340  type_name = 'bytes'
341  value_types = (str, bytearray)
342 
343  def _non_string_convert(self, value, explicit_type=True):
344  return bytes(value)
345 
346  def _convert(self, value, explicit_type=True):
347  try:
348  return value.encode('latin-1')
349  except UnicodeEncodeError as err:
350  invalid = value[err.start:err.start+1]
351  raise ValueError(f"Character '{invalid}' cannot be mapped to a byte.")
352 
353 
354 @TypeConverter.register
356  type = bytearray
357  type_name = 'bytearray'
358  value_types = (str, bytes)
359 
360  def _non_string_convert(self, value, explicit_type=True):
361  return bytearray(value)
362 
363  def _convert(self, value, explicit_type=True):
364  try:
365  return bytearray(value, 'latin-1')
366  except UnicodeEncodeError as err:
367  invalid = value[err.start:err.start+1]
368  raise ValueError(f"Character '{invalid}' cannot be mapped to a byte.")
369 
370 
371 @TypeConverter.register
373  type = datetime
374  type_name = 'datetime'
375  value_types = (str, int, float)
376 
377  def _convert(self, value, explicit_type=True):
378  return convert_date(value, result_format='datetime')
379 
380 
381 @TypeConverter.register
383  type = date
384  type_name = 'date'
385 
386  def _convert(self, value, explicit_type=True):
387  dt = convert_date(value, result_format='datetime')
388  if dt.hour or dt.minute or dt.second or dt.microsecond:
389  raise ValueError("Value is datetime, not date.")
390  return dt.date()
391 
392 
393 @TypeConverter.register
395  type = timedelta
396  type_name = 'timedelta'
397  value_types = (str, int, float)
398 
399  def _convert(self, value, explicit_type=True):
400  return convert_time(value, result_format='timedelta')
401 
402 
403 @TypeConverter.register
405  type = Path
406  abc = PathLike
407  type_name = 'Path'
408  value_types = (str, PurePath)
409 
410  def _convert(self, value, explicit_type=True):
411  return Path(value)
412 
413 
414 @TypeConverter.register
416  type = NoneType
417  type_name = 'None'
418 
419  @classmethod
420  def handles(cls, type_):
421  return type_ in (NoneType, None)
422 
423  def _convert(self, value, explicit_type=True):
424  if value.upper() == 'NONE':
425  return None
426  raise ValueError
427 
428 
429 @TypeConverter.register
431  type = list
432  type_name = 'list'
433  abc = Sequence
434  value_types = (str, Sequence)
435 
436  def __init__(self, used_type, custom_converters=None, languages=None):
437  super().__init__(used_type, custom_converters, languages)
438  types = self._get_nested_types_get_nested_types(used_type, expected_count=1)
439  if not types:
440  self.converterconverter = None
441  else:
442  self.type_nametype_nametype_nametype_name = type_repr(used_type)
443  self.converterconverter = self.converter_forconverter_for(types[0], custom_converters, languages)
444 
445  @classmethod
446  def handles(cls, type_):
447  # `type_ is not Tuple` is needed with Python 3.6.
448  return super().handles(type_) and type_ is not Tuple
449 
450  def no_conversion_needed(self, value):
451  if isinstance(value, str):
452  return False
453  return super().no_conversion_needed(value)
454 
455  def _non_string_convert(self, value, explicit_type=True):
456  return self._convert_items_convert_items(list(value), explicit_type)
457 
458  def _convert(self, value, explicit_type=True):
459  return self._convert_items_convert_items(self._literal_eval_literal_eval(value, list), explicit_type)
460 
461  def _convert_items(self, value, explicit_type):
462  if not self.converterconverter:
463  return value
464  return [self.converterconverter.convert(i, v, explicit_type, kind='Item')
465  for i, v in enumerate(value)]
466 
467 
468 @TypeConverter.register
470  type = tuple
471  type_name = 'tuple'
472  value_types = (str, Sequence)
473 
474  def __init__(self, used_type, custom_converters=None, languages=None):
475  super().__init__(used_type, custom_converters, languages)
476  self.convertersconverters = ()
477  self.homogenoushomogenous = False
478  types = self._get_nested_types_get_nested_types(used_type)
479  if not types:
480  return
481  if types[-1] is Ellipsis:
482  types = types[:-1]
483  if len(types) != 1:
484  raise TypeError(f'Homogenous tuple used as a type hint requires '
485  f'exactly one nested type, got {len(types)}.')
486  self.homogenoushomogenous = True
487  self.type_nametype_nametype_nametype_name = type_repr(used_type)
488  self.convertersconverters = tuple(self.converter_forconverter_for(t, custom_converters, languages)
489  for t in types)
490 
491  def _non_string_convert(self, value, explicit_type=True):
492  return self._convert_items_convert_items(tuple(value), explicit_type)
493 
494  def _convert(self, value, explicit_type=True):
495  return self._convert_items_convert_items(self._literal_eval_literal_eval(value, tuple), explicit_type)
496 
497  def _convert_items(self, value, explicit_type):
498  if not self.convertersconverters:
499  return value
500  if self.homogenoushomogenous:
501  conv = self.convertersconverters[0]
502  return tuple(conv.convert(str(i), v, explicit_type, kind='Item')
503  for i, v in enumerate(value))
504  if len(self.convertersconverters) != len(value):
505  raise ValueError(f'Expected {len(self.converters)} '
506  f'item{s(self.converters)}, got {len(value)}.')
507  return tuple(conv.convert(i, v, explicit_type, kind='Item')
508  for i, (conv, v) in enumerate(zip(self.convertersconverters, value)))
509 
510 
511 @TypeConverter.register
513  type = 'TypedDict'
514  value_types = (str, Mapping)
515 
516  def __init__(self, used_type, custom_converters, languages=None):
517  super().__init__(used_type, custom_converters, languages)
518  self.convertersconverters = {n: self.converter_forconverter_for(t, custom_converters, languages)
519  for n, t in used_type.__annotations__.items()}
520  self.type_nametype_nametype_name = used_type.__name__
521  # __required_keys__ is new in Python 3.9.
522  self.required_keysrequired_keys = getattr(used_type, '__required_keys__', frozenset())
523 
524  @classmethod
525  def handles(cls, type_):
526  return isinstance(type_, typeddict_types)
527 
528  def no_conversion_needed(self, value):
529  return False
530 
531  def _non_string_convert(self, value, explicit_type=True):
532  return self._convert_items_convert_items(value)
533 
534  def _convert(self, value, explicit_type=True):
535  return self._convert_items_convert_items(self._literal_eval_literal_eval(value, dict))
536 
537  def _convert_items(self, value):
538  not_allowed = []
539  for key in value:
540  try:
541  converter = self.convertersconverters[key]
542  except KeyError:
543  not_allowed.append(key)
544  else:
545  if converter:
546  value[key] = converter.convert(key, value[key], kind='Item')
547  if not_allowed:
548  error = f'Item{s(not_allowed)} {seq2str(sorted(not_allowed))} not allowed.'
549  available = [key for key in self.convertersconverters if key not in value]
550  if available:
551  error += f' Available item{s(available)}: {seq2str(sorted(available))}'
552  raise ValueError(error)
553  missing = [key for key in self.required_keysrequired_keys if key not in value]
554  if missing:
555  raise ValueError(f"Required item{s(missing)} "
556  f"{seq2str(sorted(missing))} missing.")
557  return value
558 
559 
560 @TypeConverter.register
562  type = dict
563  abc = Mapping
564  type_name = 'dictionary'
565  aliases = ('dict', 'map')
566  value_types = (str, Mapping)
567 
568  def __init__(self, used_type, custom_converters=None, languages=None):
569  super().__init__(used_type, custom_converters, languages)
570  types = self._get_nested_types_get_nested_types(used_type, expected_count=2)
571  if not types:
572  self.convertersconverters = ()
573  else:
574  self.type_nametype_nametype_nametype_name = type_repr(used_type)
575  self.convertersconverters = tuple(self.converter_forconverter_for(t, custom_converters, languages)
576  for t in types)
577 
578  def _non_string_convert(self, value, explicit_type=True):
579  if issubclass(self.used_typeused_type, dict) and not isinstance(value, dict):
580  value = dict(value)
581  return self._convert_items_convert_items(value, explicit_type)
582 
583  def _convert(self, value, explicit_type=True):
584  return self._convert_items_convert_items(self._literal_eval_literal_eval(value, dict), explicit_type)
585 
586  def _convert_items(self, value, explicit_type):
587  if not self.convertersconverters:
588  return value
589  convert_key = self.__get_converter__get_converter(self.convertersconverters[0], explicit_type, 'Key')
590  convert_value = self.__get_converter__get_converter(self.convertersconverters[1], explicit_type, 'Item')
591  return {convert_key(None, k): convert_value(str(k), v) for k, v in value.items()}
592 
593  def __get_converter(self, converter, explicit_type, kind):
594  if not converter:
595  return lambda name, value: value
596  return lambda name, value: converter.convert(name, value, explicit_type,
597  kind=kind)
598 
599 
600 @TypeConverter.register
602  type = set
603  abc = Set
604  type_name = 'set'
605  value_types = (str, Container)
606 
607  def __init__(self, used_type, custom_converters=None, languages=None):
608  super().__init__(used_type, custom_converters, languages)
609  types = self._get_nested_types_get_nested_types(used_type, expected_count=1)
610  if not types:
611  self.converterconverter = None
612  else:
613  self.type_nametype_nametype_nametype_name = type_repr(used_type)
614  self.converterconverter = self.converter_forconverter_for(types[0], custom_converters, languages)
615 
616  def _non_string_convert(self, value, explicit_type=True):
617  return self._convert_items_convert_items(set(value), explicit_type)
618 
619  def _convert(self, value, explicit_type=True):
620  return self._convert_items_convert_items(self._literal_eval_literal_eval(value, set), explicit_type)
621 
622  def _convert_items(self, value, explicit_type):
623  if not self.converterconverter:
624  return value
625  return {self.converterconverter.convert(None, v, explicit_type, kind='Item')
626  for v in value}
627 
628 
629 @TypeConverter.register
631  type = frozenset
632  type_name = 'frozenset'
633 
634  def _non_string_convert(self, value, explicit_type=True):
635  return frozenset(super()._non_string_convert(value, explicit_type))
636 
637  def _convert(self, value, explicit_type=True):
638  # There are issues w/ literal_eval. See self._literal_eval for details.
639  if value == 'frozenset()':
640  return frozenset()
641  return frozenset(super()._convert(value, explicit_type))
642 
643 
644 @TypeConverter.register
646  type = Union
647 
648  def __init__(self, union, custom_converters, languages=None):
649  super().__init__(self._get_types_get_types(union))
650  self.convertersconverters = tuple(self.converter_forconverter_for(t, custom_converters, languages)
651  for t in self.used_typeused_type)
652 
653  def _get_types(self, union):
654  if not union:
655  return ()
656  if isinstance(union, tuple):
657  return union
658  return union.__args__
659 
660  @property
661  type_name = property
662 
663  def type_name(self):
664  return ' or '.join(type_name(t) for t in self.used_typeused_type)
665 
666  @classmethod
667  def handles(cls, type_):
668  return is_union(type_, allow_tuple=True)
669 
670  def _handles_value(self, value):
671  return True
672 
673  def no_conversion_needed(self, value):
674  for converter in self.convertersconverters:
675  if converter and converter.no_conversion_needed(value):
676  return True
677  return False
678 
679  def _convert(self, value, explicit_type=True):
680  for converter in self.convertersconverters:
681  if not converter:
682  return value
683  try:
684  return converter.convert('', value, explicit_type)
685  except ValueError:
686  pass
687  raise ValueError
688 
689 
691 
692  def __init__(self, used_type, converter_info, languages=None):
693  super().__init__(used_type, languages=languages)
694  self.converter_infoconverter_info = converter_info
695 
696  @property
697  type_name = property
698 
699  def type_name(self):
700  return self.converter_infoconverter_info.name
701 
702  @property
703  doc = property
704 
705  def doc(self):
706  return self.converter_infoconverter_info.doc
707 
708  @property
709  value_types = property
710 
711  def value_types(self):
712  return self.converter_infoconverter_info.value_types
713 
714  def _handles_value(self, value):
715  return not self.value_typesvalue_typesvalue_typesvalue_types or isinstance(value, self.value_typesvalue_typesvalue_typesvalue_types)
716 
717  def _convert(self, value, explicit_type=True):
718  try:
719  return self.converter_infoconverter_info.converter(value)
720  except ValueError:
721  raise
722  except Exception:
723  raise ValueError(get_error_message())
Keeps a list of languages and unifies the translations in the properties.
Definition: languages.py:34
def _convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def __init__(self, union, custom_converters, languages=None)
def __init__(self, used_type, converter_info, languages=None)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def __init__(self, used_type, custom_converters=None, languages=None)
def __get_converter(self, converter, explicit_type, kind)
def _non_string_convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def __init__(self, used_type, custom_converters=None, languages=None)
def _convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert_items(self, value, explicit_type)
def __init__(self, used_type, custom_converters=None, languages=None)
def _convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def __init__(self, used_type, custom_converters=None, languages=None)
def _convert(self, value, explicit_type=True)
def _non_string_convert(self, value, explicit_type=True)
def _handle_error(self, name, value, kind, error=None, strict=True)
def _get_nested_types(self, type_hint, expected_count=None)
def converter_for(cls, type_, custom_converters=None, languages=None)
def convert(self, name, value, explicit_type=True, strict=True, kind='Argument')
def __init__(self, used_type, custom_converters=None, languages=None)
def _convert(self, value, explicit_type=True)
def __init__(self, used_type, custom_converters, languages=None)
def _non_string_convert(self, value, explicit_type=True)
def convert_time(time, result_format='number', exclude_millis=False)
Converts between supported time formats.
Definition: DateTime.py:391
def convert_date(date, result_format='timestamp', exclude_millis=False, date_format=None)
Converts between supported date formats.
Definition: DateTime.py:370
def get_error_message()
Returns error message of the last occurred exception.
Definition: error.py:34
def eq(str1, str2, ignore=(), caseless=True, spaceless=True)
Definition: match.py:24
def type_repr(typ)
Return string representation for types.
Definition: robottypes.py:116
def is_union(item, allow_tuple=False)
Definition: robottypes.py:76
def safe_str(item)
Definition: unic.py:21