python参数在函数中可以当做任意类型使用,强制在Python中使用函数参数类型?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值