python - 如何让用户通过 Python 中的命令行指定枚举
问题描述
在 cv2 包中,有枚举定义为:
aruco.DICT_4X4_50
aruco.DICT_5X5_50
依此类推,映射到 0, 1, 2, ... 。我想编写一个脚本,用户通过命令行指定这些枚举并且代码执行它应该做的事情,并且想知道是否有一种优雅的方式来做到这一点。现在,我有一个解析器来检查所有可能的枚举,这很糟糕,因为如果枚举在包中得到更新,我的代码将无法使用它们。
理想情况下,我只想查看通过命令行提供的“字符串”是否对应于有效的枚举,然后将其转发给使用枚举的函数。
这是一个最小的例子:
from cv2 import aruco
import sys
def create_board(arucodict):
try:
aruco_dict = aruco.getPredefinedDictionary(arucodict)
except:
print('WRONG')
return None, None
squareLength = 10
markerLength = 7
board = aruco.CharucoBoard_create(4, 4, squareLength, markerLength, aruco_dict)
imboard = board.draw((500, 500),0,1)
arucoParams = aruco.DetectorParameters_create()
return imboard, arucoParams
if __name__=="__main__":
# User specifies the aruco dictionary he wants
# Expects aruco.DICT_4X4_50, or aruco.DICT_5x5_50 etc
arucodict = sys.argv[1]
imb1, ap1 = create_board(arucodict) enter code here
解决方案
你试过getattr()
吗?在此处查看文档
from enum import IntEnum
class numbers(IntEnum):
zero = 0
one = 1
two = 2
string = "zero" # this would come from sys.argv
try:
value = getattr(numbers, string)
print(value)
except AttributeError:
raise Exception("Not an enum")
这里需要注意的是,用户只能输入zero
,而不是numbers.zero
编辑:
Ethan Furman 指出,如果你使用 Python 的enum
包,你可以简单地使用
value = numbers[string]
而不是getattr(numbers,string)
.
推荐阅读
- azure - 如何通过 ARM 模板在 StorageAccount 中设置选定的网络
- html - HTML/CSS 需要帮助在两个元素之间创建下划线
- java - 在数据库的第一个添加新项目(位置 0)
- django - Django获取由外键标识的所有模型行
- azure - Windows 10 for Azure 上的 Windows Powershell 问题
- java - Spring websocket无法接收大数据
- html - Sticky header not working with resizable column in Primeng.?
- java - 如何关闭膨胀层?
- python - 错误 Python pandas:时间数据 '20160101-000000' 与格式 '%YYYY%mm%dd-%HH%MM%SS' 不匹配
- sql - 排除某些值的 SQL 约束?