Force a function parameter type in Python?

前端 未结 2 1452
有刺的猬
有刺的猬 2020-12-16 01:22

I have a function in a Python class that adds Interfaces to a list.

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


        
相关标签:
2条回答
  • 2020-12-16 02:09

    Since i'm not the only one on this project, I don't want somebody calling the RegisterAsListener function with an incorrect data type

    Document the function thoroughly, then let incorrect parameters throw exceptions. The user of RegisterAListener should be able to use the documentation to know what kind of data the function expects, and - if given incorrect parameters - the resulting exception should make it clear what the user of RegisterAListener did wrong.

    0 讨论(0)
  • 2020-12-16 02:22

    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.

    Here's an example on how to do something like that: 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__
    

    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
    <type 'int'>: 5
    Calling the float method
    <type 'float'>: 5.0
    
    0 讨论(0)
提交回复
热议问题