/usr/lib/python3/dist-packages/pydispatch/robustapply.py is in python3-pydispatch 2.0.5-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | """Robust apply mechanism
Provides a function "call", which can sort out
what arguments a given callable object can take,
and subset the given arguments to match only
those which are acceptable.
"""
import sys
if sys.hexversion >= 0x3000000:
im_func = '__func__'
im_self = '__self__'
im_code = '__code__'
func_code = '__code__'
else:
im_func = 'im_func'
im_self = 'im_self'
im_code = 'im_code'
func_code = 'func_code'
def function( receiver ):
"""Get function-like callable object for given receiver
returns (function_or_method, codeObject, fromMethod)
If fromMethod is true, then the callable already
has its first argument bound
"""
if hasattr(receiver, '__call__'):
# Reassign receiver to the actual method that will be called.
if hasattr( receiver.__call__, im_func) or hasattr( receiver.__call__, im_code):
receiver = receiver.__call__
if hasattr( receiver, im_func ):
# an instance-method...
return receiver, getattr(getattr(receiver, im_func), func_code), 1
elif not hasattr( receiver, func_code):
raise ValueError('unknown reciever type %s %s'%(receiver, type(receiver)))
return receiver, getattr(receiver,func_code), 0
def robustApply(receiver, *arguments, **named):
"""Call receiver with arguments and an appropriate subset of named
"""
receiver, codeObject, startIndex = function( receiver )
acceptable = codeObject.co_varnames[startIndex+len(arguments):codeObject.co_argcount]
for name in codeObject.co_varnames[startIndex:startIndex+len(arguments)]:
if name in named:
raise TypeError(
"""Argument %r specified both positionally and as a keyword for calling %r"""% (
name, receiver,
)
)
if not (codeObject.co_flags & 8):
# fc does not have a **kwds type parameter, therefore
# remove unacceptable arguments.
named = dict([(k,v) for k,v in named.items() if k in acceptable])
return receiver(*arguments, **named)
|