gpt4 book ai didi

python - 在 Python 中强制函数参数类型?

转载 作者:太空狗 更新时间:2023-10-29 18:25:47 26 4
gpt4 key购买 nike

我在 Python 类中有一个函数可以将接口(interface)添加到列表中。

def RegisterAsListener(self, inListener):
self.__TransitListeners.append(inListener)

这很好,因为一个类只需要从我的接口(interface)继承,获取这个对象,并为所有更新注册自己。

class ITransit():
def TransitUpdate(self, data):
raise NotImplementedError("You must define this function.")

(假设我正确地制作了一个界面)

因为我不是这个项目中唯一的人,所以我不希望有人使用不正确的数据类型调用 RegisterAsListener 函数。我可以在寄存器函数中放入代码来检查类型,但如果编译器在程序员试图输入不正确的数据类型时对他们大喊大叫,一切都会更容易。

def RegisterAsListener(self, IListener inListener):
self.__TransitListeners.append(inListener)

有什么办法吗?

最佳答案

尽管我强烈建议不要这样做,而只强制执行使用抽象基类 (http://docs.python.org/2/library/abc.html) 的某些方法,但这是可能的。

这是一个关于如何做类似事情的例子:http://www.artima.com/weblogs/viewpost.jsp?thread=101605

# 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__

以及使用它的代码:

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)

示例输出:

Calling the int method
<type 'int'>: 5
Calling the float method
<type 'float'>: 5.0

关于python - 在 Python 中强制函数参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14858192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com