簡體   English   中英

如何讓用戶通過Python中的命令行指定枚舉

[英]How to have a user specify an enum via command line in 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM