Skip to content

Instantly share code, notes, and snippets.

@JelleZijlstra
Created January 14, 2022 14:00
Show Gist options
  • Save JelleZijlstra/91d31f04e6eea5bb24b96f06c06fedb2 to your computer and use it in GitHub Desktop.
Save JelleZijlstra/91d31f04e6eea5bb24b96f06c06fedb2 to your computer and use it in GitHub Desktop.
def _parse_callable_arg_list(args: Sequence[object]) -> Sequence[SigParameter]:
return [
SigParameter(f".arg{i}", ParameterKind.POSITIONAL_ONLY, annotation=parse_type(arg))
for i, arg in enumerate(args)
]
# Proposed "nested" approach
def parse_callable(node: Union[CallableType, AsyncCallableType]) -> Value:
return_value = parse_type(node.returns)
if isinstance(node, AsyncCallableType):
return_value = GenericValue(Awaitable, [return_value])
if isinstance(node.args, AnyArguments):
params = [SigParameter("...", ParameterKind.ELLIPSIS)]
elif isinstance(node.args, CallableArgumentsList):
params = _parse_callable_arg_list(node.args.posonlyargs)
else: # CallableConcatenation
params = [
*_parse_callable_arg_list(node.args.posonlyargs)
# ... validate that it's really a ParamSpec
SigParameter("P", ParameterKind.ELLIPSIS, annotation=node.args.paramspec)
]
return CallableValue(Signature.make(params, return_value))
# Proposed "flat" approach
def parse_callable(node: CallableType) -> Value:
return_value = parse_type(node.returns)
if node.is_async:
return_value = GenericValue(Awaitable, [return_value])
params = []
if node.is_any_params:
params.append(SigParameter("...", ParameterKind.ELLIPSIS))
if node.positional_only_args:
params += _parse_callable_arg_list(node.positional_only_args)
if node.param_spec:
# ... validate that it's really a ParamSpec
params.append(SigParameter("P", ParameterKind.ELLIPSIS, annotation=node.args.paramspec))
return CallableValue(Signature.make(params, return_value))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
OSZAR »