def verify_callback(callback): """ ensure callback has a signature similar to one of these: def callback(ctx, **data): stuff() def callback(self, ctx, **data): stuff() """ try: s = pep362.signature(callback) except AttributeError: #used declare_channel? s = pep362.signature(callback.fxn) not_more_than2 = lambda s: len(s._parameters) < 3 if2then_self_is_one = lambda s: ( len(s._parameters)!=2 and True ) or \ ( len(s._parameters)==2 and 'self' in s._parameters ) at_least_one = lambda s: len(s._parameters) > 0 if not s.var_args: # maybe warn them or something here.. pass tests = [ #s.var_args, not_more_than2(s), if2then_self_is_one(s), #at_least_one(s), ] if not s.var_kw_args: #all(tests): err='callback@{name} needs to accept **kargs' raise CallbackError(err.format(name=s.name))
def sig_example(): from pep362 import signature def f(a,b,c): pass sig = signature(f) parameters = sig._parameters #{'a':parameter1,'b':parameter2, .. } print 'sig_example',sig, parameters from IPython import Shell; Shell.IPShellEmbed(argv=['-noconfirm_exit'])()
def func2sig(func): """ returns sig_obj, sig_str """ sig = signature(func) parameters = sig._parameters sort_machine = lambda x, y: cmp(x[0],y[0]) func_sig = [ [position(parameters, k), k, parameters[k] ] for k in parameters.keys() ] func_sig.sort(sort_machine) # sort args by their position in signature func_sig = [ display(x) for x in func_sig ] func_sig = func_sig[1:] # probably an instancemethod.. chop off "self" func_sig = ' '.join(func_sig) sig_str = "{name} {sig}".format(name=sig.name,sig=func_sig) return sig, sig_str
def help(self, indent=0): """ shows help for this plugin """ cls_names = [ x for x in dir(self.__class__) if \ is_published_to_commandline(getattr(self, x)) and\ x!='help' ] modname = self.__class__.__module__.lower().split('.')[-1] if not indent: print "->",modname.upper() indent=3 for name in cls_names: func = getattr(self,name) doc = func.__doc__ parent = self.__class__.__name__.lower() progname = os.path.split(sys.argv[0])[1] sig = signature(func) parameters = sig._parameters display1 = lambda k: '<{k}>'.format(k=k) dvdisplay = lambda p: (p.default_value is not None and \ '[<{k}={deflt}>'.format(**{'k':p.name, 'deflt':p.default_value})) or \ ('[<{k}>]'.format(**{'k':p.name})) position = lambda k: parameters[k].position sort_machine = lambda x, y: cmp(x[0],y[0]) func_sig = [ [position(k), k, parameters[k] ] for k in parameters.keys() ] func_sig.sort(sort_machine) # sort args by their position in signature display = lambda t: (hasattr(t[2],'default_value') and \ dvdisplay(t[2])) or \ (True and \ display1(t[1])) func_sig = [ display(x) for x in func_sig ] func_sig = func_sig[1:] # probably an instancemethod.. chop off "self" func_sig = ' '.join(func_sig) _ex = "{kinbaku} {plugin} {name} {sig}".format(kinbaku = progname, plugin = modname, name = name, sig = func_sig) print ' '*indent + ' {example}{space1}{doc}'.format(example=_ex, space1=' '*(45-len(_ex)), doc=doc or "")
def sig_example(): from pep362 import signature def f(a,b,c): pass sig = signature(f) parameters = sig._parameters #{'a':parameter1,'b':parameter2, .. } print 'sig_example',sig, parameters