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?
3 Réponses :
Vous pouvez utiliser une expression régulière, pour
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
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('"'))
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.
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;)