def __call__(self, obj): func = obj poks = [] while isinstance(func, _PokTranslator): poks.append(func) func = func.func sig = _specifiers.forged_signature(func, auto=False) parameters = [] to_use = self.to_use.copy() for name, parameter in sig.parameters.items(): if name in self.annotations: parameters.append(parameter.replace( annotation=self.annotations[name])) to_use.remove(name) else: parameters.append(parameter) if to_use: raise ValueError( 'the following parameters to be annotated ' 'were not found in {0}: {1}' .format(func.__name__, ', '.join(to_use))) if self.ret is _util.UNSET: sig = sig.replace(parameters=parameters) else: sig = sig.replace(parameters=parameters, return_annotation=self.ret) func.__signature__ = sig for pok in reversed(poks): pok._prepare() return obj
def __call__(self, obj): func = obj poks = [] while isinstance(func, _PokTranslator): poks.append(func) func = func.func sig = _specifiers.forged_signature(func, auto=False) parameters = [] to_use = self.to_use.copy() for name, parameter in sig.parameters.items(): if name in self.annotations: parameters.append( parameter.replace(annotation=self.annotations[name])) to_use.remove(name) else: parameters.append(parameter) if to_use: raise ValueError('the following parameters to be annotated ' 'were not found in {0}: {1}'.format( func.__name__, ', '.join(to_use))) if self.ret is _util.UNSET: sig = sig.replace(parameters=parameters) else: sig = sig.replace(parameters=parameters, return_annotation=self.ret) func.__signature__ = sig for pok in reversed(poks): pok._prepare() return obj
def _prepare(self): intersection = self.posoarg_names & self.kwoarg_names if intersection: raise ValueError( 'Parameters marked as both positional-only and keyword-only: ' + ' '.join(repr(name) for name in intersection)) to_use = self.posoarg_names | self.kwoarg_names sig = _specifiers.forged_signature(self.func, auto=False) params = [] kwoparams = [] kwopos = self.kwopos = [] found_pok = found_kws = False for i, param in enumerate(sig.parameters.values()): if param.kind == param.POSITIONAL_OR_KEYWORD: if param.name in self.posoarg_names: if found_pok: raise ValueError( '{0.name!r} was requested to become a positional-' 'only parameter, but comes after a regular ' 'parameter'.format(param)) params.append( param.replace(kind=param.POSITIONAL_ONLY)) to_use.remove(param.name) elif param.name in self.kwoarg_names: kwoparams.append( param.replace(kind=param.KEYWORD_ONLY)) kwopos.append((i, param)) to_use.remove(param.name) else: found_pok = True params.append(param) else: # not a POK param if param.name in to_use: raise ValueError( '{0.name!r} is not of kind POSITIONAL_OR_KEYWORD, but:' ' {0.kind}'.format(param)) if param.kind == param.VAR_KEYWORD: found_kws = True params.extend(kwoparams) params.append(param) if not found_kws: params.extend(kwoparams) if to_use: raise ValueError("Parameters not found: " + ' '.join(to_use)) self.__signature__ = sig.replace( parameters=params, sources=_signatures.copy_sources(sig.sources, {self.func:self}))
def _autokwoargs(exceptions, func): sig = _specifiers.forged_signature(func, auto=False) args = [] exceptions = set(exceptions) for param in sig.parameters.values(): if (param.kind == param.POSITIONAL_OR_KEYWORD and param.default != param.empty): try: exceptions.remove(param.name) except KeyError: args.append(param.name) if exceptions: raise ValueError( "parameters referred to by 'exceptions' not present: " + ' '.join(repr(name) for name in exceptions)) return kwoargs(*args)(func)
def _test(self, sig_str, old_fmt=None): sig = support.s(sig_str) p_sig_str = str(sig) try: self.assertEqual('(' + sig_str + ')', p_sig_str) except AssertionError: if old_fmt is None: raise self.assertEqual('(' + old_fmt + ')', p_sig_str) pf_sig_str = str( _specifiers.forged_signature(support.func_from_sig(sig))) try: self.assertEqual('(' + sig_str + ')', pf_sig_str) except AssertionError: if old_fmt is None: raise self.assertEqual('(' + old_fmt + ')', pf_sig_str)
def _kwoargs_start(start, _kwoargs, func, *args, **kwargs): kwoarg_names = set(_kwoargs) found = False sig = _specifiers.forged_signature(func, auto=False).parameters.values() for param in sig: if param.kind == param.POSITIONAL_OR_KEYWORD: if found or param.name == start: found = True kwoarg_names.add(param.name) elif param.kind != param.POSITIONAL_ONLY: break # no more POKs now if not found: raise ValueError('{0!r} not found in {1.__name__}{2}'.format( start, func, sig)) return _PokTranslator(func, kwoargs=kwoarg_names, get=partial(_kwoargs_start, start, _kwoargs))
def _kwoargs_start(start, _kwoargs, func, *args, **kwargs): kwoarg_names = set(_kwoargs) found = False sig = _specifiers.forged_signature(func, auto=False).parameters.values() for param in sig: if param.kind == param.POSITIONAL_OR_KEYWORD: if found or param.name == start: found = True kwoarg_names.add(param.name) elif param.kind != param.POSITIONAL_ONLY: break # no more POKs now if not found: raise ValueError('{0!r} not found in {1.__name__}{2}'.format( start, func, sig)) return _PokTranslator( func, kwoargs=kwoarg_names, get=partial(_kwoargs_start, start, _kwoargs))
def _autokwoargs(exceptions, func): sig = _specifiers.forged_signature(func, auto=False) args = [] exceptions = set(exceptions) for param in sig.parameters.values(): if ( param.kind == param.POSITIONAL_OR_KEYWORD and param.default != param.empty ): try: exceptions.remove(param.name) except KeyError: args.append(param.name) if exceptions: raise ValueError( "parameters referred to by 'exceptions' not present: " + ' '.join(repr(name) for name in exceptions)) return kwoargs(*args)(func)
def forward_signatures(func, calls, args, kwargs, sig): if args or kwargs: bap = sig.bind_partial(*args, **kwargs) else: bap = EmptyBoundArguments() def rn(obj, unknown=True): return resolve_name(obj, func, bap.arguments, unknown=unknown) for (wrapped, fwdargs, fwdkwargs, fwdvarargs, fwdvarkwargs, use_varargs, use_varkwargs, hide_args, hide_kwargs) in calls: if not (use_varargs or use_varkwargs): continue try: wrapped_func = rn(wrapped, unknown=False) except UnresolvableName: raise UnknownForwards fwdargsvals = [rn(arg) for arg in fwdargs] fwdargsvals.extend(rn(fwdvarargs)) fwdkwargsvals = dict((n, rn(arg)) for n, arg in fwdkwargs.items()) fwdkwargsvals.update(rn(fwdvarkwargs)) using_partial = wrapped_func == functools.partial if using_partial: wrapped_func = fwdargsvals.pop(0) try: wrapped_sig = forged_signature(wrapped_func, args=fwdargsvals, kwargs=fwdkwargsvals) except (ValueError, TypeError): raise UnknownForwards try: ausig = _signatures.forwards(sig, wrapped_sig, len(fwdargs) - using_partial, hide_args, hide_kwargs, use_varargs, use_varkwargs, using_partial, *fwdkwargs) yield ausig except ValueError: raise UnknownForwards
def forward_signatures(func, calls, args, kwargs, sig): if args or kwargs: bap = sig.bind_partial(*args, **kwargs) else: bap = EmptyBoundArguments() def rn(obj, unknown=True): return resolve_name(obj, func, bap.arguments, unknown=unknown) for ( wrapped, fwdargs, fwdkwargs, fwdvarargs, fwdvarkwargs, use_varargs, use_varkwargs, hide_args, hide_kwargs) in calls: if not (use_varargs or use_varkwargs): continue try: wrapped_func = rn(wrapped, unknown=False) except UnresolvableName: raise UnknownForwards fwdargsvals = [rn(arg) for arg in fwdargs] fwdargsvals.extend(rn(fwdvarargs)) fwdkwargsvals = dict((n, rn(arg)) for n, arg in fwdkwargs.items()) fwdkwargsvals.update(rn(fwdvarkwargs)) using_partial = wrapped_func == functools.partial if using_partial: wrapped_func = fwdargsvals.pop(0) try: wrapped_sig = forged_signature( wrapped_func, args=fwdargsvals, kwargs=fwdkwargsvals) except (ValueError, TypeError): raise UnknownForwards try: ausig = _signatures.forwards( sig, wrapped_sig, len(fwdargs) - using_partial, hide_args, hide_kwargs, use_varargs, use_varkwargs, using_partial, *fwdkwargs) yield ausig except ValueError: raise UnknownForwards