First, these are the methods we are talking about, sorted by signature types:
def copy (self, tgt, flags=None, ttype=None) : pass
def copy (self, src, tgt, flags=None, ttype=None) : pass
def link (self, tgt, flags=None, ttype=None) : pass
def link (self, src, tgt, flags=None, ttype=None) : pass
def move (self, tgt, flags=None, ttype=None) : pass
def move (self, src, tgt, flags=None, ttype=None) : pass
def get_size (self, flags=None, ttype=None) : pass
def get_size (self, tgt, flags=None, ttype=None) : pass
def remove (self, flags=None, ttype=None) : pass
def remove (self, tgt, flags=None, ttype=None) : pass
def is_dir (self, ttype=None) : pass
def is_dir (self, tgt, ttype=None) : pass
def is_entry (self, ttype=None) : pass
def is_entry (self, tgt, ttype=None) : pass
def is_file (self, ttype=None) : pass
def is_file (self, tgt, ttype=None) : pass
def is_link (self, ttype=None) : pass
def is_link (self, tgt, ttype=None) : pass
def read_link (self, ttype=None) : pass
def read_link (self, tgt, ttype=None) : pass
So, the differences are never in the kwargs, always in the args w/o
keyword. The kwargs are always flags, i.e. integers, or enums, which
we can also define as integers.
Python does not allow method overloading, only method replacement.
But it *does* allow for variable parameter lists (*args, **kwargs).
We can discard the int types from the args, and count the remaining
arguments:
d = {'src' : 'src', 'tgt' : 'tgt', 'flags' : 3, 'ttype' : 2}
l = list (v for v in d.values () if not isinstance (v, int))
print len(l) # 2
So, one could code the following:
API level:
class ns.entry :
# def copy (self, tgt, flags=None, ttype=None) : pass
# def copy (self, src, tgt, flags=None, ttype=None) : pass
def copy (self, *args, **kwargs) :
non_int_args = args + list (v for v in kwargs.values () \
if not v == None and not isinstance (v, int))
if len (non_int_args) == 2 :
return self._adaptor.copy_self (args, kwargs)
if len (non_int_args) == 3 :
return self._adaptor.copy (args, kwargs)
raise BadParameter ("signature mismatch: copy (url, [url], flags, ttype)")
All further signature checks are automatically done on CPI /
adaptor level -- although one could easily add type checking for flags
and ttypes at this point. As the number of cases we need to support
is quite limited, the above should be easy to put in decorators.