Python: разделить строку и преобразовать в другой тип - PullRequest
0 голосов
/ 19 марта 2020

У меня есть функция, которая может получить строку в следующем формате:

"true"^^<http://www.w3.org/2001/XMLSchema#boolean>
"100"^^<http://www.w3.org/2001/XMLSchema#int>

Теперь я хочу разделить строку на символы ^^ и преобразовать первую часть строки на основе второй часть. Я также хочу удалить " перед преобразованием.

Это мой код, который я использую для этого:

def getValue(tObject):
    toReturn = tObject.split("^^")
    if len(toReturn) == 2:
        if toReturn[1] == "<http://www.w3.org/2001/XMLSchema#boolean>":
            return bool(toReturn[0].replace('"', ""))
        elif toReturn[1] == "<http://www.w3.org/2001/XMLSchema#int>":
            return int(toReturn[0].replace('"', ""))
    return None

Но я не так доволен этим. Может быть, есть более элегантный (pythoni c) способ архивировать это?

Ответы [ 3 ]

0 голосов
/ 19 марта 2020

Вместо if len(...) вы можете просто попытаться распаковать результат, кроме ValueError. Тогда вы можете использовать dict для типов и str.strip вместо str.replace:

types = {'boolean': bool, 'int': int}
try:
    value, type_hint = tObject.split('^^')
except ValueError:
    return None
else:
    return types[type_hint.rstrip('>').rsplit('#', 1)[1]](value.strip('"'))
0 голосов
/ 19 марта 2020

Во-первых, вы можете удалить return None, так как функция возвращает None по умолчанию.

Во-вторых, вы можете использовать toReturn[1].endswith("boolean>"), чтобы соответствовать концу строки, вместо того, чтобы сопоставлять всю строку с toReturn[1] == "<http://www.w3.org/2001/XMLSchema#boolean>". То же самое и со строкой int.

В-третьих, вы можете хранить возвращаемое значение в одной переменной до if..elif, тогда вам не нужно рассчитывать его дважды для каждого условия.

Код:

def getValue(tObject):
    toReturn = tObject.split("^^")

    if len(toReturn) == 2:
        return_value = toReturn[0].replace('"', "")

        if toReturn[1].endswith("boolean>"):
            return bool(return_value)
        elif toReturn[1].endswith("int>"):
            return int(return_value)

Возможно, это не так уж и много, как улучшение логики c, но код теперь выглядит менее загроможденным. Если вы не хотите более кратких, "pythoni c" способов решения этой проблемы, другие ответы могут быть более подходящими.

0 голосов
/ 19 марта 2020

Вы можете использовать регулярное выражение, чтобы

  • проверить, является ли данное значение действительным
  • получить значение для приведения и способ приведения
PATTERN = re.compile(r'"(.*)"\^\^<http:.*#(\w+)>')
types = {"boolean": bool, "int": int}

def getValue(value):
    m = PATTERN.fullmatch(value)
    return types[m.group(2)](m.group(1)) if m else None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...