0
votes

Python: diviser la chaîne et convertir en un autre type

J'ai une fonction qui pourrait obtenir une chaîne au format suivant:

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

Maintenant, je veux diviser la chaîne sur les caractères ^^ et convertir le premier partie de la chaîne basée sur la deuxième partie. Je souhaite également supprimer le " avant la conversion.

Voici mon code que j'utilise pour cela:

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

Mais je ne suis pas si content. Y a-t-il peut-être une manière plus élégante (pythonique) d'archiver cela?


1 commentaires

Vous pouvez maintenant penser à accepter une réponse ou en commenter une pour obtenir des détails;) pour récompenser ceux qui ont passé du temps pour vous;)


3 Réponses :


0
votes

Vous pouvez utiliser une expression régulière, pour

  • vérifier si la valeur donnée est valide
  • récupérer la valeur à caster et la manière de la caster
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


0 commentaires

0
votes

Au lieu de if len (...) , vous pouvez simplement essayer de décompresser le résultat et sauf une ValueError . Ensuite, vous pouvez utiliser un dict pour les types et str.strip au lieu de 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 commentaires

0
votes

Premièrement, vous pouvez supprimer return None , car la fonction renvoie None par défaut.

Deuxièmement, vous pouvez utiliser toReturn [1] .endswith ("boolean>") pour faire correspondre la fin de la chaîne, au lieu de faire correspondre la chaîne entière avec toReturn [1] = = "" . Idem pour la chaîne int également.

Troisièmement, vous pouvez stocker la valeur de retour dans une variable avant if..elif , alors vous n'avez pas à la calculer deux fois pour chaque condition.

Code:

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)

Ce n'est peut-être pas une grande amélioration logique, mais le code semble moins encombré maintenant. Si vous ne voulez pas des manières plus concises et "pythoniques" de résoudre ce problème, les autres réponses pourraient être plus appropriées.


0 commentaires