python中的逻辑参数检查
我不确定我的问题是否有具体答案,但无论如何。我正在编写一个包含很多参数的函数,每个参数可以是python中的逻辑参数检查,python,parsing,parameters,typechecking,Python,Parsing,Parameters,Typechecking,我不确定我的问题是否有具体答案,但无论如何。我正在编写一个包含很多参数的函数,每个参数可以是None,也可以是有限的值范围。因为我不相信用户会给我好的输入,所以我必须检查每个参数的类型,如果它的类型正确(或者None),那么我想看看它是否在正确的范围内。这意味着我有很多这样的代码: # size if isinstance(size, str): if size in range(4): self.data[uid]['size'] = int(size) els
None
,也可以是有限的值范围。因为我不相信用户会给我好的输入,所以我必须检查每个参数的类型,如果它的类型正确(或者None
),那么我想看看它是否在正确的范围内。这意味着我有很多这样的代码:
# size
if isinstance(size, str):
if size in range(4):
self.data[uid]['size'] = int(size)
else:
warnings.warn("ID %s: illegal size %s" % (uid, size))
self.data[uid]['size'] = None
elif size == None:
self.data[uid]['size'] = None
else:
warnings.warn("ID %s: illegal size %s" % (uid, str(size)))
self.data[uid]['size'] = None
try:
parse(input)
catch Exception, e:
raise ParseError("while parsing %r: %r" %(input, e)), None, sys.exc_info()[2]
if size in ["0", "1", "2", "3"]: # alternative: if size in map(str, range(4)):
self.data[uid]['size'] = int(size)
else:
if size != None:
warnings.warn("ID %s: illegal size %s" % (uid, size))
self.data[uid]['size'] = None
等等。由于这变得越来越重复,我想知道是否有一个库可以自动执行,抛出异常/警告并减少代码冗余
谢谢如果您的项目是一个库,而您的“用户”是另一个开发人员,请不要这样做。最多用断言替换测试:
assert 0 <= int(size) <= 4, "size must be between 0 and 4"
assert 0我同意上面的说法:假设size
是正确的类型,如果不是,则引发异常(或返回错误)
不过,在处理可能引发异常的输入时,有一种有用的模式:包装输入引发的任何异常,以便它们包含输入。例如,您将得到:
ParseError: while parsing 'number = foo': ValueError: invalid literal for int() with base 10: 'foo'
raise
的第三个参数将使用原始回溯,因此堆栈跟踪将指向实际导致错误的行(例如,size=int(value)
),而不是调用raise
),我将重写以下内容:
# size
if isinstance(size, str):
if size in range(4):
self.data[uid]['size'] = int(size)
else:
warnings.warn("ID %s: illegal size %s" % (uid, size))
self.data[uid]['size'] = None
elif size == None:
self.data[uid]['size'] = None
else:
warnings.warn("ID %s: illegal size %s" % (uid, str(size)))
self.data[uid]['size'] = None
像这样:
# size
if isinstance(size, str):
if size in range(4):
self.data[uid]['size'] = int(size)
else:
warnings.warn("ID %s: illegal size %s" % (uid, size))
self.data[uid]['size'] = None
elif size == None:
self.data[uid]['size'] = None
else:
warnings.warn("ID %s: illegal size %s" % (uid, str(size)))
self.data[uid]['size'] = None
try:
parse(input)
catch Exception, e:
raise ParseError("while parsing %r: %r" %(input, e)), None, sys.exc_info()[2]
if size in ["0", "1", "2", "3"]: # alternative: if size in map(str, range(4)):
self.data[uid]['size'] = int(size)
else:
if size != None:
warnings.warn("ID %s: illegal size %s" % (uid, size))
self.data[uid]['size'] = None
我真正不喜欢的是使用isinstance(size,str)
(显式类型检查在Python中通常是不受欢迎的,因为它很容易中断)
这就是为什么在Python中很难找到一个库来自动执行类型检查的原因:它违背了该语言的核心意图
我想知道是否会有
可以自动执行此操作的库,
抛出异常/警告并减少
代码冗余
我用它来做这样的东西。它似乎只用于解析HTML表单,但它很乐意解析和验证您传递给它的任何内容。您可以定义一次验证所有输入的模式类。我必须检查每个参数的类型。
听起来您做得不对。您应该将其用作预期类型,然后捕获失败。我以前认为我也必须检查输入。当我停止这样做时,编程变得容易多了。假设一切正常,然后处理错误。这与python的成语“请求原谅比允许更容易”有关。使用大小为None
而不是=
(因为==
调用。与无比较时,可能会正确,也可能不会正确。从什么时候开始可以存在(大小,str)
和size==None
都是真的吗?既然isinstance(size,str)
和size在范围(4)
中什么时候都是真的??您的if/else/elif/else处于相同的缩进级别!请考虑发布一个实际编译和运行的代码(并没有任何标签)的仔细拷贝。如果是额外的迂回,检查应该很可能是“代码> ISTAN(大小,基字符串)< /Code >,只是ICAS<代码>大小<代码>是<代码> Unicode < /Code >。- 1:不一致:如果size =“Fo”或size =“123.45”,则会遇到异常。但是,如果大小为“-666”,则会发出警告;如果大小==1.23(一个浮点值),则不会发出警告@John Machin:True,已修复(针对OP的假定要求)。