diff engine/extensions/pychan/tools.py @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children 9a1529f9625e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/engine/extensions/pychan/tools.py	Sun Jun 29 18:44:17 2008 +0000
@@ -0,0 +1,58 @@
+# coding: utf-8
+
+### Functools ###
+
+def applyOnlySuitable(func,**kwargs):
+	"""
+	This nifty little function takes another function and applies it to a dictionary of
+	keyword arguments. If the supplied function does not expect one or more of the
+	keyword arguments, these are silently discarded. The result of the application is returned.
+	This is useful to pass information to callbacks without enforcing a particular signature.
+	"""
+	if hasattr(func,'im_func'):
+		code = func.im_func.func_code
+		varnames = code.co_varnames[1:code.co_argcount]#ditch bound instance
+	else:
+		code = func.func_code
+		varnames = code.co_varnames[0:code.co_argcount]
+
+	#http://docs.python.org/lib/inspect-types.html
+	if code.co_flags & 8:
+		return func(**kwargs)
+	for name,value in kwargs.items():
+		if name not in varnames:
+			del kwargs[name]
+	return func(**kwargs)
+
+def callbackWithArguments(callback,*args,**kwargs):
+	"""
+	Curries a function with extra arguments to
+	create a suitable callback.
+	
+	If you don't know what this means, don't worry.
+	It is designed for the case where you need
+	different buttons to execute basically the same code
+	with different argumnets.
+	
+	Usage::
+	  # The target callback
+	  def printStuff(text):
+	      print text
+	  # Mapping the events
+	  gui.mapEvents({
+	      'buttonHello' : callbackWithArguments(printStuff,"Hello"),
+	      'buttonBye' : callbackWithArguments(printStuff,"Adieu")
+	  })
+	"""
+	def real_callback():
+		callback(*args,**kwargs)
+	return real_callback
+
+
+def this_is_deprecated(func,message=None):
+	if message is None:
+		message = repr(func)
+	def wrapped_func(*args,**kwargs):
+		print "PyChan: You are using the DEPRECATED functionality: %s" % message
+		return func(*args,**kwargs)
+	return wrapped_func