当前位置: 首页 > 面试题库 >

强制在Python中使用函数参数类型?

唐繁
2023-03-14
问题内容

我在Python类中有一个将接口添加到列表的函数。

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

很好,因为一个类只需要从我的接口继承即可,获取此对象,然后为所有更新注册自己。

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

(假设我正确创建了一个界面)

由于我不是该项目的唯一成员,因此我不希望有人用错误的数据类型调用RegisterAsListener函数。我可以在寄存器函数中放入代码来检查类型,但是如果编译器在试图推入错误的数据类型时只是对程序员大吼大叫,这将更加容易。

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

有什么办法吗?


问题答案:

尽管我强烈建议您不要这样做,而只能使用Abstract Base
Classes(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允许任意顺序的参数(只要它们被命名)。 我们遇到的问题是,随着一些更大的函数的增长,人们可能会在和之间添加参数,这意味着错误的值可能会传递给未命名的参数。另外,有时不清楚需要输入什么。我们正在寻找一种方法来强迫人们命名某些参数- 不仅是编码标准,还是理想的标志或pydev插件? 因此,在上述4个

  • 问题内容: 如何使AB的构造函数使用适当的参数调用A和B的构造函数? 我试过了 但这给我一个错误。 问题答案: 你没有通过。 请注意,如果这种继承层次结构变得更加复杂,则会遇到构造函数无法执行或无法重新执行的问题。外观到(和问题与),并从不要忘记继承如果你在2.x和你的类不从别的继承。

  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • # 强制函数永远以inline的形式调用 例子 #if defined(__GNUC__) #define FORCEDINLINE __attribute__((always_inline)) #else #define FORCEDINLINE #endif FORCEDINLINE int add(int a,int b) { return a+b; } 技巧 上面的例子是gc

  • 本文向大家介绍Python函数参数类型*、**的区别,包括了Python函数参数类型*、**的区别的使用技巧和注意事项,需要的朋友参考一下 刚开始学习python,python相对于java确实要简洁易用得多。内存回收类似hotspot的可达性分析, 不可变对象也如同java得Integer类型,with函数类似新版本C++的特性,总体来说理解起来比较轻松。只是函数部分参数的"*"与"**",闭包

  • 问题内容: 我对PHP函数的默认值感到困惑。说我有一个这样的功能: 如果我想为$ x使用默认参数并为$ y设置不同的参数怎么办? 我一直在尝试不同的方法,但我变得更加困惑。例如,我尝试了以下两种方法: 但是这两个都不会为$ x产生适当的默认参数。我也试图通过变量名来设置它。 我完全希望这样的事情能奏效。但这根本不符合我的预期。似乎不管我做什么,每次调用该函数时,无论如何我都必须最终键入默认参数。而

  • 是否可以使用等待与参数?例如: 即使是这样,似乎也不是最好的主意。以前有人这样做过吗?

  • 我只是想知道是否有人能帮我解决这个问题。作为我学校项目的一部分,我目前正在为大学锦标赛设计一个计分程序。 现在,我有一个单间的主菜单。py文件,但我有一个不同的注册学生函数。py文件。到目前为止,我已经成功地将该函数调用到主菜单程序中 因此,我调用了register student函数末尾的主菜单函数。这可以让你注册一个学生(他的名字会被添加到一个文本文件中),然后把你送回主菜单,让用户选择另一个