首页 > 解决方案 > 如何让用户通过 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

标签: pythoncommand-lineenums

解决方案


你试过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).


推荐阅读