如何在Python3中仅接受字符串类型参数

如何在Python3中仅接受字符串类型参数,python,argparse,Python,Argparse,我正在尝试为我的python文件创建一些参数。我只想接受字符串类型作为参数。下面是我的foo.py代码- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser() # options to the user parser.add_argument('--source_table', type = str, required = True) args = par

我正在尝试为我的python文件创建一些参数。我只想接受字符串类型作为参数。下面是我的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'>
它打印

<class 'str'>
它打印

<class 'str'>

我想抛出一个错误,说明只接受字符串类型。

“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'>
import argparse
导入re#regex
如果名称=“\uuuuu main\uuuuuuuu”:
parser=argparse.ArgumentParser()
#给用户的选项
parser.add_参数('--source_table',type=str,required=True)
args=parser.parse_args()
params=vars(args)#将参数转换为字典
src_table=params['source_table']
#仅检查alpha
如果re.match(r'^[a-zA-Z]+$,src_表)为无:
打印(“输入错误,仅限字母字符”)
返回
#继续正常执行
打印(类型(src_表))#打印
或者您可以创建自己的argparse类型,如下所示:

编辑 @idlehands在下面指出,
isalpha()
仅对字母就足够了。如果您想允许使用
-
\uu
或其他特殊字符,那么regex仍然是一种选择。将上述代码中的正则表达式更新为
re.match(r'^[a-zA-Z\-+$,src_table)
以匹配
-
,而

“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'>
import argparse
导入re#regex
如果名称=“\uuuuu main\uuuuuuuu”:
parser=argparse.ArgumentParser()
#给用户的选项
parser.add_参数('--source_table',type=str,required=True)
args=parser.parse_args()
params=vars(args)#将参数转换为字典
src_table=params['source_table']
#仅检查alpha
如果re.match(r'^[a-zA-Z]+$,src_表)为无:
打印(“输入错误,仅限字母字符”)
返回
#继续正常执行
打印(类型(src_表))#打印
或者您可以创建自己的argparse类型,如下所示:

编辑
@idlehands在下面指出,
isalpha()
仅对字母就足够了。如果您想允许使用
-
\uu
或其他特殊字符,那么regex仍然是一种选择。将上述代码中的正则表达式更新为
re.match(r'^[a-zA-Z\-+$,src_table)
以匹配
-

此要求可通过
类型
函数实现:

def stringonly(astr):
    try:
        int(astr)
    except ValueError:
        return astr
    raise argparse.ArgumentTypeError('only a string type accepted')
这是一种
~int
类型。只有当字符串可以解释为整数时,才会引发错误。其他测试,如
isalpha
也可以。我本可以提出一个
TypeError
ValueError
,但是
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')

此要求可通过
类型
功能实现:

def stringonly(astr):
    try:
        int(astr)
    except ValueError:
        return astr
    raise argparse.ArgumentTypeError('only a string type accepted')
这是一种
~int
类型。只有当字符串可以解释为整数时,才会引发错误。其他测试,如
isalpha
也可以。我本可以提出一个
TypeError
ValueError
,但是
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')

123
可以是字符串或int。如果它是a1怎么办?它仍然是有效字符串吗?如果您只需要字母字符,则可能需要手动处理
str.isalpha()
。如果您只对某种模式感兴趣,则可能需要使用正则表达式来检查有效性。支持@Idlehands所说内容的链接:
123
可以是字符串或int。如果它是a1怎么办?它仍然是有效字符串吗?如果您只需要alpha字符,则可能需要手动处理
str.isalpha()
。如果您只对某种模式感兴趣,则可能需要使用正则表达式来检查有效性。支持@Idlehands所说内容的链接:
.isalpha()
就足以进行测试,对于这个特殊的用例,不需要使用正则表达式…非常好。我忘了
isalpha()
。但是,如果在某些情况下允许使用
testnew
之类的内容,则
isalpha()
将为
False
testnew
也将无法通过检查,但如果需要,regex将为您提供更大的灵活性。我想说OP的问题不太清楚,无法确定
.isalpha()
是否足够,或者需要一个regex的变体。这个
isalpha
测试可以放在
类型
函数中。
.isalpha()
对于测试来说足够了,不需要在这个特定的用例中使用regex…非常好的一点。我忘了
isalpha()
。但是,如果在某些情况下允许使用
testnew
之类的内容,则
isalpha()
将为
False
testnew
也将无法通过检查,但如果需要,regex将为您提供更大的灵活性。我想说OP的问题不太清楚,无法确定
.isalpha()
是否足够,或者需要一个regex变体。这个
isalpha
测试可以放入
类型
函数中。