Как заставить пользователя указывать перечисление через командную строку в Python - PullRequest
0 голосов
/ 09 января 2019

В пакете 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

1 Ответ

0 голосов
/ 09 января 2019

Вы пробовали 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

редактирует:

Итан Фурман отмечает, что если вы используете пакет enum Python, вы можете просто использовать

value = numbers[string]

вместо getattr(numbers,string).

...