有没有一种方法可以自定义PyInputPlus显示的错误消息?

时间:2020-10-26 06:49:59

标签: python

我最近了解了PyInputPlus及其使用方法。 这确实很棒,但是我想知道是否有一种方法可以自定义当用户输入无效值时PyInputPlus显示的错误消息。 例如,在下面的代码中

import pyinputplus as pyip
response=pyip.inputInt('please, enter a number: ')

如果用户输入字母“ s”,则PyInputPlus显示-

's'不是整数

我想对消息进行分类,以另一种(非英语)语言显示。 我试图在PyInputPlus的官方文档中找到该解决方案,但除了使用我不感兴趣的 inputCustom 之外,什么也没找到。

3 个答案:

答案 0 :(得分:0)

我认为您可以尝试将其作为例外处理。将逻辑放在“ try”块中,并将要显示为错误的异常放在异常块中。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.boot.SpringApplication;

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"})
public class JobsAppStarterTest {

    @Test
    @PrepareForTest(SpringApplication.class)
    public void testSpringStartUp() {
        PowerMockito.mockStatic(SpringApplication.class);
        SpringApplication.run(JobsAppStarter.class, new String[] {"args"});
        JobsAppStarter.main(new String[] {"args"});
    }
}

您可以在我写“ SyntaxError”的地方写下错误的名称。

答案 1 :(得分:0)

首先,我会极力劝阻使用第三方库,因为它们会在代码中添加您不了解的错误。许多功能非常有用,得到了良好的支持,并且/或者具有某些功能,可能需要一段时间才能复制。

但是,在这种情况下,您可以使用int(input()),请这样做!
(它将以您期望的方式表现得更多)

在代码中挖掘同一作者的validation actually calls another 3rd-party library

这看起来像转到代码path here where the real Exception is,然后转到here to be caught

也许

while True:
    value = input("Please enter a number (q to quit): ")
    if value.startswith(('Q', 'q')):
        sys.exit("quit")
    try:
        value = int(value)
    except ValueError as ex:  # custom error message below!
        print("invalid input '{}', expected int".format(value))
    else:  # did not raise Exception
        break  # escape while loop

如果您要查找特定的异常,repr()非常有用

>>> try:
...     raise ValueError("some string")
... except IOError:
...     print("reached IOError")
... except Exception as ex:
...     print("unexpected Exception: {}".format(repr(ex)))
...     raise ex
...
unexpected Exception: ValueError('some string')
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
  File "<stdin>", line 2, in <module>
ValueError: some string

答案 2 :(得分:0)

如果您准备使用 PyInputPlus 执行此操作,则可以使用参数 blockRegexes 获得所需的行为,该参数允许设置自定义错误消息(在文档中,对于不存在的PyInputPlus parameters 中的参数 blocklistRegexes):

<块引用>

blocklistRegexes (Sequence, None):正则表达式 str 或 (regex_str, error_msg_str) 元组的序列,如果匹配,将显式验证失败。

由于编写只匹配整数的正则表达式比匹配除整数之外的所有内容的正则表达式更简单,因此我首先使用 blockRegexes 禁止所有使用正则表达式 .* 的内容,然后使用 allowRegexes使用正则表达式 ^-?\d+$' 添加整数例外(仅正整数和负整数,请参阅 https://regex101.com/r/1ymJzE/1)。

以下示例接受负整数或正整数,否则打印自定义西班牙语错误消息:

import pyinputplus as pyip

response = pyip.inputInt('please, enter a number: ',
             allowRegexes=[r'^-?\d+$'],
             blockRegexes=[(r'.*','¡Esto no es un número entero!')]
           )

执行:

please, enter a number: a
¡Esto no es un número entero!
please, enter a number: 1-2
¡Esto no es un número entero!
please, enter a number: 3.2
¡Esto no es un número entero!
please, enter a number: 5,4
¡Esto no es un número entero!
please, enter a number: -12

您也可以通过提供一个接受除整数以外的所有内容的正则表达式,仅使用 blockRegexes 来实现相同的效果。如果应该允许负数,这个正则表达式会更复杂一些。有关正则表达式的详细说明,请参阅 this answer to a respective question

此代码与上面的代码实现了相同的结果:

import pyinputplus as pyip

response = pyip.inputInt('please, enter a number: ',
             blockRegexes=[(r'[^-0-9]+|[0-9]+(?=-)|^-$|-{2,}','¡Esto no es un número entero!')]
           )