用可选参数修饰python方法

用可选参数修饰python方法,python,decorator,Python,Decorator,我有一个Python类,其中包含许多带有签名的方法: def select_xxx(self, arg1 , arg2 , .. argn, intersect = False) 也就是说,这些方法具有数量不等的(1-3)个位置参数,并且一个可选参数与默认值False相交。我想用一个decorator来修饰所有这些方法,该decorator将检查intersect参数的值并相应地采取不同的操作。我目前的做法是这样的: def select_decorator(select_method):

我有一个Python类,其中包含许多带有签名的方法:

def select_xxx(self, arg1 , arg2 , .. argn, intersect = False)
也就是说,这些方法具有数量不等的(1-3)个位置参数,并且一个可选参数与默认值False相交。我想用一个decorator来修饰所有这些方法,该decorator将检查intersect参数的值并相应地采取不同的操作。我目前的做法是这样的:

def select_decorator(select_method):

  def select_wrapper( self , *args, intersect = False , **kwargs)
     if intersect:
        # Special init code for intersect == True
        select_method( self , *args , **kwargs)
     else:
        # Normal call path for intersect == False 
        select_method( self , *args , **kwargs)

  return select_wrapper  

@select_decorator
select_xxx( self , arg1 , arg2 , intersect = False)
但是,在装饰器内部将可选参数相交到*args和**kwargs的混合中,目前并不令人高兴。我可以牺牲**kwargs功能,如果这使问题更容易解决的话。有什么建议吗


Joakim

我假设intersect将始终作为关键字参数传递。在这种情况下,你可以简单地在你的室内装饰

def select_decorator(select_method):

  def select_wrapper( self , *args, **kwargs):
     intersect = kwargs.has_key('intersect') and kwargs['intersect']
     if intersect:
        # Special init code for intersect == True
        select_method( self , *args , **kwargs)
     else:
        # Normal call path for intersect == False 
        select_method( self , *args , **kwargs)
  return select_wrapper  

或False
没有任何作用。不要使用
has_key
,它在Python2.x中被弃用,并从Python3.x中删除。使用
get
方法:
intersect=kwargs.get('intersect',False)
或使用
中的
测试kwargs和kwargs中的
'intersect['intersect']
如果您需要更多关于装饰器和注释的帮助,请参阅我的博客文章。