如何让用户在Python中通过命令行指定枚举

2024-10-03 17:18:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在cv2包中,枚举定义为:

aruco.DICT_4X4_50
aruco.DICT_5X5_50

以此类推,映射到0,1,2。我想编写一个脚本,其中用户通过命令行指定这些枚举,代码执行它应该执行的操作,我想知道是否有一种优雅的方法来实现这一点。现在,我有一个解析器检查所有可能的枚举,这是不好的,因为如果在包中更新枚举,我的代码将无法使用它们。你知道吗

理想情况下,我只想看看通过命令行提供的“string”是否对应于有效的枚举,然后将其转发给使用该枚举的函数。你知道吗

下面是一个简单的例子:

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

Tags: 命令行importboardnonereturncreatesyscv2
1条回答
网友
1楼 · 发布于 2024-10-03 17:18:53

你试过getattr()吗?参见文档here

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

编辑:

ethanfurman指出,如果您使用的是Python的enum包,那么只需使用

value = numbers[string]

而不是getattr(numbers,string)。你知道吗

相关问题 更多 >