如何在Python 3中只接受字符串类型参数

时间:2018-03-07 17:40:56

标签: python argparse

我正在尝试为我的python文件创建一些参数参数。我只想接受String类型作为参数。下面是我的foo.py代码 -

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    # options to the user 
    parser.add_argument('--source_table', type = str, required = True)

    args = parser.parse_args()
    params = vars(args) # convert arguments to dictionary
    print(type(params['source_table'])) # prints <class 'str'>

当我将字符串参数作为 -

>python foo.py --source_table=abc

打印

<class 'str'>

然而,即使我输入

>python foo.py --source_table=123

打印

<class 'str'>

我想抛出一条错误,说只接受String类型。

2 个答案:

答案 0 :(得分:2)

"123"仍然是一个字符串,但似乎您只想使用字母字符。您可以在继续执行之前检查输入:

import argparse
import re # regex 
if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    # options to the user 
    parser.add_argument('--source_table', type = str, required = True)

    args = parser.parse_args()
    params = vars(args) # convert arguments to dictionary
    src_table = params['source_table']
    # check for alpha only
    if re.match(r'^[a-zA-Z]+$', src_table) is None:
        print("bad input, alpha characters only")
        return
    # continue normal execution
    print(type(src_table)) # prints <class 'str'>

或者您可以像这里一样创建自己的argparse类型:Python argparse regex expression

修改 @idlehands在下面指出isalpha()足够只有字母。如果您想允许-_或其他特殊字符,那么正则表达式仍然是可行的方法。将上述代码中的正则表达式更新为re.match(r'^[a-zA-Z\-_]+$', src_table)以匹配-_

答案 1 :(得分:0)

此要求可以使用type函数实现:

def stringonly(astr):
    try:
        int(astr)
    except ValueError:
        return astr
    raise argparse.ArgumentTypeError('only a string type accepted')

这是一种~int类型。仅当字符串可以解释为整数时才会引发错误。其他测试如isalpha也可以。我本可以提出TypeErrorValueError,但ArgumentTypeError可让我自定义错误消息。

它将用作:

In [22]: parser = argparse.ArgumentParser()
In [23]: parser.add_argument('-s','--source', type=stringonly);


In [24]: parser.parse_args('-s 123'.split())
usage: ipython3 [-h] [-s SOURCE]
ipython3: error: argument -s/--source: only a string type accepted
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

In [25]: parser.parse_args('-s foo'.split())
Out[25]: Namespace(source='foo')