如何在Python3中仅接受字符串类型参数
我正在尝试为我的python文件创建一些参数。我只想接受字符串类型作为参数。下面是我的foo.py代码-如何在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
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
测试可以放入类型
函数中。