#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).