Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的逻辑参数检查_Python_Parsing_Parameters_Typechecking - Fatal编程技术网

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的假定要求)。