Disons que j'ai une fonction où il convertit 8 en un type saisi par l'utilisateur:

def convert_8_to_type(to_type):

Que dois-je utiliser pour le convertir en to_type?
Quelque chose comme ça:

to_type(8)

Sauf que je voudrais que cela fonctionne correctement (étant donné que to_type n'est pas une fonction). Je pourrais simplement mettre une grande déclaration if ... else if ..., comme dans celle-ci:

if to_type == int:
    return int(8)
else if to_type == float:
    return float(8)
else if to_type == Decimal:
    return Decimal(8)
else if to_type == str:
    return str(8)
else if to_type == bool:
    return bool(8)
else if to_type == bytes:
    return bytes(8)

Mais que se passe-t-il si l'utilisateur essaie de convertir en un type que j'ai implicitement fourni dans la table de conversion?

-1
CATboardBETA 14 mars 2021 à 22:32

2 réponses

Meilleure réponse

to_type est en effet une fonction si c'est ce que passe l'appelant:

def convert_8_to_type(to_type):
   return to_type(8)
>>> print(convert_8_to_type(bytes))
b'\x00\x00\x00\x00\x00\x00\x00\x00'

Dériver le type d'un str qui nomme le type est un tout autre problème, mais à partir de votre exemple de code, il semble que vous obtenez le type réel, pas son nom sous forme de chaîne (par exemple, vous avez to_type == int , pas to_type == 'int'), donc cela devrait "juste fonctionner".

1
Samwise 14 mars 2021 à 19:41

Cela retournera l'objet comme son type d'origine si une conversion non valide est spécifiée.

Puisque l'entrée utilisateur de la fonction input() est une chaîne, utilisez-la simplement comme clé dans un dictionnaire:

from decimal import Decimal


def to_type(obj, desired_type):
    conversion_table = {"int": int,
                        "float": float,
                        "Decimal": Decimal,
                        "str": str,
                        "bool": bool,
                        "bytes": bytes}
    converter = conversion_table.get(desired_type)
    if not converter:
        raise TypeError("Unsupported conversion type!")
    return converter(obj)

Production:

>>> to_type(8, "bytes")
b'\x00\x00\x00\x00\x00\x00\x00\x00'
>>> to_type(8, "dict")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in to_type
TypeError: Unsupported conversion type!
-1
blorgon 14 mars 2021 à 19:50