Поддержка нескольких типов (float, int и string) в argparse

#python #python-3.x #argparse

Вопрос:

Я использую json с python для связи с сервером, и я хотел бы определить тип данных с помощью argparse. Есть ли способ поддерживать Int, Float и строку? Я знаю, что по умолчанию аргументы argparse являются строками.

В приведенном ниже фрагменте я хочу отправить JSONArray, который может отправлять разные типы данных (в настоящее время это только int).

 parser.add_argument("-v", "--value", nargs=" ", default=[0], type=int, help="Values that will be written (Only Write and WriteComplete)")
 

У меня есть аргумент типа данных. Это необходимо для устройства, которое используется для связи после того, как сервер обработает мой запрос.

 parser.add_argument("-dt", "--data-type", help="Data type of the sub indices (i.e. "uint32")")
 

Поэтому я подумал использовать этот параметр, чтобы определить, является ли он плавающим, int или строкой.

Комментарии:

1. Как бы вы определили, является ли значение int, плавающей точкой или строкой? А как насчет числа, которое должно быть строкой?

2. Возможно, вы пытаетесь интерпретировать литералы ? Как в "1.2" str том , что такое а, 4.5 есть а float и 42 есть ан int ?

3. У меня есть аргумент типа данных. Это необходимо для устройства, которое используется для связи после того, как сервер обработает мой запрос. parser.add_argument(«-dt», «—тип данных», help=»Тип данных подиндексов (т. Е. «uint32″)»), Поэтому я подумал использовать этот параметр, чтобы определить, является ли он плавающим, int или строкой.

4. Похоже, что сам аргумент все еще является str «тогда», и интерпретацию должен выполнять ваш собственный код.

5. argparse не удается соединить два аргумента. Вы должны написать свой собственный код, который интерпретирует на value основе data_type .

Ответ №1:

Ну, оказывается, вы не можете соединить два аргумента вместе. Мое решение состоит в том, чтобы создать функцию, которая сравнивает два аргумента, с которыми я хочу взаимодействовать.

 def convertValue(value, dataType):
    intTypes = ["int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64"]
    if dataType in intTypes:
        return int(value, 0)

    floatTypes = ["float", "double"]
    if dataType in floatTypes:
        return float(value)

    return value
 

При генерации запроса JSON я вызываю указанную выше функцию.

 "data": {
    "values": [convertValue(v, dataType) for v in value],
    "type": dataType,
}
 

Комментарии:

1. Вы можете написать свой convertValue также с помощью dict : учитывая converters = {"int8": int, "int16": int, ..., "float": float, "double": float} , что вы можете использовать его как coverters.get(data_type, lambda x: x)(value) . Это имеет дополнительное преимущество в том, что это поиск O(1) по сравнению с поиском O(n).