【问题标题】:Decorate python method with optional argument使用可选参数装饰 python 方法
【发布时间】:2012-03-05 11:28:13
【问题描述】:

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

def select_xxx(self, arg1 , arg2 , .. argn, intersect = False)

即这些方法具有不同 (1-3) 数量的位置参数,并且可选参数与默认值 False 相交。我想用一个装饰器来装饰所有这些方法,该装饰器将检查 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 功能。有什么建议吗?

乔金

【问题讨论】:

标签: python decorator


【解决方案1】:

我假设 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  

【讨论】:

  • or False 什么都不做。
  • 不要使用has_key,它在 Python 2.x 中已被弃用并从 Python 3.x 中删除。要么使用get方法:intersect = kwargs.get('intersect', False)要么使用in测试'intersect' in kwargs and kwargs['intersect']
猜你喜欢
  • 1970-01-01
  • 2015-08-22
  • 2011-09-01
  • 2014-10-15
  • 2019-11-16
  • 2016-03-26
  • 2012-03-14
  • 2014-05-09
  • 2020-07-11
相关资源
最近更新 更多