def stringify_signature(sig: inspect.Signature, show_annotation: bool = True, show_return_annotation: bool = True, unqualified_typehints: bool = False) -> str: """Stringify a Signature object. :param show_annotation: If enabled, show annotations on the signature :param show_return_annotation: If enabled, show annotation of the return value :param unqualified_typehints: If enabled, show annotations as unqualified (ex. io.StringIO -> StringIO) """ if unqualified_typehints: mode = 'smart' else: mode = 'fully-qualified' args = [] last_kind = None for param in sig.parameters.values(): if param.kind != param.POSITIONAL_ONLY and last_kind == param.POSITIONAL_ONLY: # PEP-570: Separator for Positional Only Parameter: / args.append('/') if param.kind == param.KEYWORD_ONLY and last_kind in (param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY, None): # PEP-3102: Separator for Keyword Only Parameter: * args.append('*') arg = StringIO() if param.kind == param.VAR_POSITIONAL: arg.write('*' + param.name) elif param.kind == param.VAR_KEYWORD: arg.write('**' + param.name) else: arg.write(param.name) if show_annotation and param.annotation is not param.empty: arg.write(': ') arg.write(stringify_annotation(param.annotation, mode)) if param.default is not param.empty: if show_annotation and param.annotation is not param.empty: arg.write(' = ') else: arg.write('=') arg.write(object_description(param.default)) args.append(arg.getvalue()) last_kind = param.kind if last_kind == Parameter.POSITIONAL_ONLY: # PEP-570: Separator for Positional Only Parameter: / args.append('/') if (sig.return_annotation is Parameter.empty or show_annotation is False or show_return_annotation is False): return '(%s)' % ', '.join(args) else: annotation = stringify_annotation(sig.return_annotation, mode) return '(%s) -> %s' % (', '.join(args), annotation)
def stringify_signature(sig: inspect.Signature, show_annotation: bool = True, show_return_annotation: bool = True) -> str: """Stringify a Signature object. :param show_annotation: Show annotation in result """ args = [] last_kind = None for param in sig.parameters.values(): # insert '*' between POSITIONAL args and KEYWORD_ONLY args:: # func(a, b, *, c, d): if param.kind == param.KEYWORD_ONLY and last_kind in ( param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY, None): args.append('*') arg = StringIO() if param.kind in (param.POSITIONAL_ONLY, param.POSITIONAL_OR_KEYWORD, param.KEYWORD_ONLY): arg.write(param.name) if show_annotation and param.annotation is not param.empty: arg.write(': ') arg.write(stringify_annotation(param.annotation)) if param.default is not param.empty: if show_annotation and param.annotation is not param.empty: arg.write(' = ') arg.write(object_description(param.default)) else: arg.write('=') arg.write(object_description(param.default)) elif param.kind == param.VAR_POSITIONAL: arg.write('*') arg.write(param.name) if show_annotation and param.annotation is not param.empty: arg.write(': ') arg.write(stringify_annotation(param.annotation)) elif param.kind == param.VAR_KEYWORD: arg.write('**') arg.write(param.name) if show_annotation and param.annotation is not param.empty: arg.write(': ') arg.write(stringify_annotation(param.annotation)) args.append(arg.getvalue()) last_kind = param.kind if (sig.return_annotation is Parameter.empty or show_annotation is False or show_return_annotation is False): return '(%s)' % ', '.join(args) else: annotation = stringify_annotation(sig.return_annotation) return '(%s) -> %s' % (', '.join(args), annotation)
def stringify_signature(sig: inspect.Signature, show_annotation: bool = True, show_return_annotation: bool = True) -> str: """Stringify a Signature object. :param show_annotation: Show annotation in result """ args = [] last_kind = None for param in sig.parameters.values(): if param.kind != param.POSITIONAL_ONLY and last_kind == param.POSITIONAL_ONLY: # PEP-570: Separator for Positional Only Parameter: / args.append('/') if param.kind == param.KEYWORD_ONLY and last_kind in (param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY, None): # PEP-3102: Separator for Keyword Only Parameter: * args.append('*') arg = StringIO() if param.kind == param.VAR_POSITIONAL: arg.write('*' + param.name) elif param.kind == param.VAR_KEYWORD: arg.write('**' + param.name) else: arg.write(param.name) if show_annotation and param.annotation is not param.empty: arg.write(': ') arg.write(stringify_annotation(param.annotation)) if param.default is not param.empty: if show_annotation and param.annotation is not param.empty: arg.write(' = ') else: arg.write('=') arg.write(object_description(param.default)) args.append(arg.getvalue()) last_kind = param.kind if last_kind == Parameter.POSITIONAL_ONLY: # PEP-570: Separator for Positional Only Parameter: / args.append('/') if (sig.return_annotation is Parameter.empty or show_annotation is False or show_return_annotation is False): return '(%s)' % ', '.join(args) else: annotation = stringify_annotation(sig.return_annotation) return '(%s) -> %s' % (', '.join(args), annotation)
def format_annotation_old(self, annotation: Any) -> str: """format_annotation() for py36 or below""" return stringify_annotation(annotation)
def format_annotation_new(self, annotation: Any) -> str: """format_annotation() for py37+""" return stringify_annotation(annotation)
def format_annotation(self, annotation: Any) -> str: """Return formatted representation of a type annotation.""" return stringify_annotation(annotation)
def format_args(self, show_annotation: bool = True) -> str: def get_annotation(param: Parameter) -> Any: if isinstance(param.annotation, str) and param.name in self.annotations: return self.annotations[param.name] else: return param.annotation args = [] last_kind = None for i, param in enumerate(self.parameters.values()): # skip first argument if subject is bound method if self.skip_first_argument and i == 0: continue arg = StringIO() # insert '*' between POSITIONAL args and KEYWORD_ONLY args:: # func(a, b, *, c, d): if param.kind == param.KEYWORD_ONLY and last_kind in ( param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY, None): args.append('*') if param.kind in (param.POSITIONAL_ONLY, param.POSITIONAL_OR_KEYWORD, param.KEYWORD_ONLY): arg.write(param.name) if show_annotation and param.annotation is not param.empty: arg.write(': ') arg.write(stringify_annotation(get_annotation(param))) if param.default is not param.empty: if param.annotation is param.empty or show_annotation is False: arg.write('=') arg.write(object_description(param.default)) else: arg.write(' = ') arg.write(object_description(param.default)) elif param.kind == param.VAR_POSITIONAL: arg.write('*') arg.write(param.name) if show_annotation and param.annotation is not param.empty: arg.write(': ') arg.write(stringify_annotation(get_annotation(param))) elif param.kind == param.VAR_KEYWORD: arg.write('**') arg.write(param.name) if show_annotation and param.annotation is not param.empty: arg.write(': ') arg.write(stringify_annotation(get_annotation(param))) args.append(arg.getvalue()) last_kind = param.kind if self.return_annotation is Parameter.empty or show_annotation is False: return '(%s)' % ', '.join(args) else: if 'return' in self.annotations: annotation = stringify_annotation(self.annotations['return']) else: annotation = stringify_annotation(self.return_annotation) return '(%s) -> %s' % (', '.join(args), annotation)