来自 电脑知识 2019-11-14 16:32 的文章
当前位置: 威尼斯国际官方网站 > 电脑知识 > 正文

Python中实现参数类型检查的简单方法

Python是一门弱类型语言,比非常多从C/C++转过来的敌人初叶不是很适应。举例,在声明一(Wissu卡塔 尔(英语:State of Qatar)(Nutrilon卡塔尔国个函数时,无法钦命参数的品类。用C做类比,那便是兼具参数都以void*类型!void类型强制转变在C++中被周边地认为是个坏习于旧贯,不到不得已而为之是不会动用的。

Python自然未有项目强制转变一说了,因为它是动态语言。首先,全部目的都从Object世襲而来,其次,它有无往不利的反思,要是调用有个别不真实的办法会有丰富抛出。大好些个气象,我们都无需做参数类型栓查,除了有的非常处境。比方,有些函数接受三个str类型,结果在实质上调用时传出的是unicode,测量试验进度中又不曾代码覆盖到,这样难点就比较严重了。化解措施也十分轻便,依据Python的自问,比较轻巧就能看清出参数的门类。然则种种地点都写检讨代码会很麻烦,并且它拉动的实际上等价钱值并不高。多个好的解决措施是行使装饰器。

'''
 >>> NONE, MEDIUM, STRONG = 0, 1, 2
 >>>
 >>> @accepts(int, int, int)
 ... def average(x, y, z):
 ...   return (x + y + z) / 2
 ...
 >>> average(5.5, 10, 15.0)
 TypeWarning: 'average' method accepts (int, int, int), but was given
 (float, int, float)
 15.25
'''
def accepts(*types, **kw):
  """ Function decorator. Checks that inputs given to decorated function
  are of the expected type.

  Parameters:
  types -- The expected types of the inputs to the decorated function.
       Must specify type for each parameter.
  kw  -- Optional specification of 'debug' level (this is the only valid
       keyword argument, no other should be given).
       debug = ( 0 | 1 | 2 )

  """
  if not kw:
    # default level: MEDIUM
    debug = 1
  else:
    debug = kw['debug']
  try:
    def decorator(f):
      def newf(*args):
        if debug == 0:
          return f(*args)
        assert len(args) == len(types)
        argtypes = tuple(map(type, args))
        if argtypes != types:
          msg = info(f.__name__, types, argtypes, 0)
          if debug == 1:
            print >> sys.stderr, 'TypeWarning: ', msg
          elif debug == 2:
            raise TypeError, msg
        return f(*args)
      newf.__name__ = f.__name__
      return newf
    return decorator
  except KeyError, key:
    raise KeyError, key + "is not a valid keyword argument"
  except TypeError, msg:
    raise TypeError, msg

def info(fname, expected, actual, flag):
  """ Convenience function returns nicely formatted error/warning msg. """
  format = lambda types: ', '.join([str(t).split("'")[1] for t in types])
  expected, actual = format(expected), format(actual)
  msg = "'%s' method " % fname 
     + ("accepts", "returns")[flag] + " (%s), but " % expected
     + ("was given", "result is")[flag] + " (%s)" % actual
  return msg

真相上讲,那也是生机勃勃种运转时检查,但效果与利益已经不错了。
越多有趣的装饰器的利用,能够仿照效法那篇文章

您大概感兴趣的稿子:

  • python通过装饰器检查函数参数数据类型的艺术
  • 在Python 3中达成项目检查器的总结方法
  • Python轻便检查测试文本类型的2种艺术【基于文件头及cchardet库】
  • Python中项目检查的详尽介绍

本文由威尼斯国际官方网站发布于电脑知识,转载请注明出处:Python中实现参数类型检查的简单方法

关键词: