概述
I have a function in a Python class that adds Interfaces to a list.
def RegisterAsListener(self, inListener):
self.__TransitListeners.append(inListener)
This is nice, because a class just needs to inherit from said my Interface, grab this object, and register itself for all updates.
class ITransit():
def TransitUpdate(self, data):
raise NotImplementedError("You must define this function.")
(assuming I made an interface correctly)
Since i'm not the only one on this project, I don't want somebody calling the RegisterAsListener function with an incorrect data type. I could put in code to check the type within the register function, but it would be easier all around if the compiler just yelled at the programmer when they try to shove in an incorrect data type.
def RegisterAsListener(self, IListener inListener):
self.__TransitListeners.append(inListener)
Is there any way to do this?
解决方案
Although I would strongly recommend not doing this and only enforcing the implementation of certain methods using Abstract Base Classes (http://docs.python.org/2/library/abc.html), it is possible.
# mm.py
registry = {}
class MultiMethod(object):
def __init__(self, name):
self.name = name
self.typemap = {}
def __call__(self, *args):
types = tuple(arg.__class__ for arg in args) # a generator expression!
function = self.typemap.get(types)
if function is None:
raise TypeError("no match")
return function(*args)
def register(self, types, function):
if types in self.typemap:
raise TypeError("duplicate registration")
self.typemap[types] = function
def multimethod(*types):
def register(function):
function = getattr(function, "__lastreg__", function)
name = function.__name__
mm = registry.get(name)
if mm is None:
mm = registry[name] = MultiMethod(name)
mm.register(types, function)
mm.__lastreg__ = function
return mm
return register
if hasattr(function, "__lastreg__"):
function = function.__lastreg__
And the code using it:
import mm
@mm.multimethod(int)
def spam(a):
print 'Calling the int method'
print '%s: %r' % (type(a), a)
@mm.multimethod(float)
def spam(a):
print 'Calling the float method'
print '%s: %r' % (type(a), a)
spam(5)
spam(5.0)
Example output:
Calling the int method
: 5
Calling the float method
: 5.0
最后
以上就是俏皮奇异果为你收集整理的python参数在函数中可以当做任意类型使用,强制在Python中使用函数参数类型?的全部内容,希望文章能够帮你解决python参数在函数中可以当做任意类型使用,强制在Python中使用函数参数类型?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复