Que faire lorsque le type de valeur est ambigu en Python?

Et s'il y a des moments où vous ne pouvez pas garantir ou prouver que vous avez un contrôle à 100% sur le type d'une valeur?

Existe-t-il un moyen pratique d'écrire comme l'inférence de type? Si quelqu'un sait, faites-le moi savoir. Est-il possible de convertir dict en struct? Ce qui est bon? J'ai senti que le type ambigu était ennuyeux **, alors j'ai décidé de réfléchir à nouveau.

Exemple

Supposons que vous ayez des données dict appelées test comme dans l'exemple ci-dessous. Je veux vérifier s'il y a un «1» dans la «clé» de chaque valeur de la variable «test».

test_dict_key_value_type.py


test = {
    0: {'key': [1, 2, 3]},
    1: {'key': None},
    2: {'key': []},
    3: {},
    4: None,
}

#Modèle 1 Utilisez une instance pour vérifier le type et utilisez get pour déterminer
for k, v in test.iteritems():
    if v is not None and isinstance(v.get('key'), list) and 1 in v.get('key'):
        print k, ':found!'


#Modèle 2 Préparez une fonction pour redéfinir les données
def set_default_dict_value_type(test, dict_value_key, dict_value_type):
    for k, v in test.iteritems():
        if v is None or not isinstance(v.get(dict_value_key), dict_value_type):
            test[k] = {
                dict_value_key: dict_value_type()
            }
    return test
# new_Puisque toutes les valeurs de clé de test sont dict, elles ne peuvent être utilisées qu'avec la méthode get.
for k, v in set_default_dict_value_type(test.copy(), 'key', list).iteritems():
    if 1 in v.get('key'):
        print k, ':found!'


#Motif 3 Essayez et ignorez
for k, v in test.iteritems():
    try:
        if 1 in v.get('key'):
            print k, ':found!'
    except:
        pass

Essayez de courir

bash


$ python test_dict_key_value_type.py
0 :found!
0 :found!
0 :found!

Résumé

Dans ce cas, si vous y réfléchissez bien, le problème est que la définition des données est ambiguë **. Je suis donc arrivé à la conclusion que ** redéfinir le type de données résoudrait le problème **. En d'autres termes, si le type est différent de la planification, on considère que les données sont corrompues et il est possible de redéfinir le type. Dans le cas ci-dessus, le «cas 2» est la méthode préférée à ce stade.

Tâche

Exemple de module

J'ai fait un exemple de module qui vérifie la liste et dict. Y a-t-il encore des améliorations?

data_type.py


#!/usr/bin/env python


def set_dict_key_value(dic, dict_value_key, dict_value_type):
    """
    :param dict dic: dict data to test
    :param str dict_value_key: dict value key name
    :param Type dict_value_type: Type Object ex. dict, list...
    :rtype: dict
    :return: redefined dict data

    ex.
    >>> test = {
        0: {'key': [1, 2, 3]},
        1: {'key': None},
        2: {'key': []},
        3: {},
        4: None,
    }
    >>> set_dict_key_value(test, 'key', list)
    {
        0: {'key': [1, 2, 3]},
        1: {'key': []},
        2: {'key': []},
        3: {'key': []},
        4: {'key': []}
    }
    """
    new_dic = dic.copy()
    for k, v in new_dic.iteritems():
        if v is None or not isinstance(v.get(dict_value_key), dict_value_type):
            new_dic[k] = {dict_value_key: dict_value_type()}
    return new_dic


def set_list_value(lst, list_value_type, default_none_value=None):
    """
    :param list lst: list data to test
    :param Type list_value_type: Type Object ex. dict, list,,,
    :param not None clean_list_default_value: Any type of data except for None
    :rtype: list
    :return: redefined list data

    ex.
    >>> a = [None, 1, 'str', False, 1.0, {1: 0}]
    >>> set_list_value(a, dict, {})
    [{}, {}, {}, {}, {}, {1: 0}]
    """
    return map(
        lambda v: v if isinstance(v, list_value_type) else list_value_type(),
        lst if default_none_value is None else
        clean_list_none_value(lst, default_none_value)
    )


def clean_list_none_value(lst, default_none_value):
    """
    Replace None with defalut_none_value

    :param list lst: list data to test
    :param not None default_none_value: Any type of data except for None
    :rtype: list
    :return: cleaned list data
    """
    return map(lambda v: default_none_value if v is None else v, lst)

Recommended Posts

Que faire lorsque le type de valeur est ambigu en Python?
Que faire lorsque l'avertissement "L'environnement est cohérent ..." apparaît dans l'environnement Anaconda
[Python] Erreur de type: l'objet 'WebElement' n'est pas itérable Que faire lorsqu'une erreur se produit
Que faire quand n'est pas dans le fichier sudoers. Cet incident sera signalé.
Que faire lorsque seule la fenêtre est affichée et que rien ne s'affiche dans le pygame
Que faire si la barre de progression n'est pas affichée dans tqdm de python
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Que faire lorsque ModuleNotFoundError: Aucun module nommé'XXX 'ne se produit en Python
Qu'est-ce que wheezy dans l'image Docker Python?
Que faire pour obtenir une feuille de calcul Google en Python
Que faire s'il y a un décimal dans python json .dumps
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
[Python] Que faire lorsqu'une erreur liée à l'authentification SSL est renvoyée
Après tout, que dois-je utiliser pour faire des comparaisons de types en Python?
Que faire lorsqu'un message d'avertissement est affiché dans la liste des pip
NameError: le nom global'dot_parser 'n'est pas défini et que faire quand il apparaît en python
Que faire lorsque l'imitation est intégrée à Python
[openpyxl] Que faire lorsque IllegalCharacterError apparaît dans pandas.DataFrame.to_excel
curl: (60) Que faire lorsque le certificat de l'émetteur n'est pas valide.
Que faire lorsque vous déclenchez ValueError, "type de hachage non pris en charge"
Que faire lorsqu'un avertissement apparaît autour de l'intégration de Python dans CheckHealth de Neovim
Comment écrire quoi faire lorsque l'application est affichée pour la première fois dans Qt pour Python avec Designer
Que faire si PyInstaller3.5 provoque une erreur dans Python3.8 (TypeError: un entier est requis (obtenu les octets de type))
Que faire lorsque "impossible d'importer le nom xxx" [Python]
Que faire si l'abandon s'affiche lors de la saisie d'une vidéo de caméra dans OpenCV
Que faire lorsque le graphique n'apparaît pas sur le notebook Jupyter (IPython)
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Je veux faire quelque chose avec Python à la fin
Que faire si Python3 Venv ne fonctionne pas bien sur Raspberry Pi
[Python] Que faire quand Aucun module nommé "pyproj.datadir" n'apparaît lors de la création d'Exe avec PyInstaller
Que faire si la commande d'impression elle-même provoque une erreur dans le python de Maya
Que faire si vous obtenez une erreur lors de l'importation de matplotlib en Python (Mac)
Que faire si vous ne voyez pas IntelliSense de Python dans VS Code sous Windows
[Introduction à Python] Quel est l'important "if __name__ == '__ main__':" lorsqu'il s'agit de modules?
Que faire lorsque Python ne passe pas de la version système dans pyenv
Je veux initialiser si la valeur est vide (python)
Que faire lorsque ʻarguments [0] .scrollIntoView (); `échoue dans python sélénium
Procédures à suivre lorsque le japonais n'est pas affiché dans matplotlib
Maîtrisez le type avec Python? (Quand faire la vérification de type)
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Que faire lorsque "En-tête HTTP_HOST non valide" apparaît dans Django
[Python] Qu'est-ce que @? (À propos des décorateurs)
Dans la commande python, python pointe vers python3.8
[python] Quelle est la clé triée?
Que faire si vous obtenez l'erreur RuntimeError: Python n'est pas installé en tant que framework lorsque vous essayez d'utiliser matplitlib et pylab dans Python 3.3
Que faire avec la sortie de PYTHON?
À quoi sert le trait de soulignement Python (_)?
Que faire si l'image n'est pas affichée à l'aide de matplotlib etc. dans le conteneur Docker
Que faire lorsqu'un artefact manquant se produit dans un fichier jar qui n'est pas défini dans pom.xml
Lorsqu'une chaîne de caractères d'une certaine série se trouve dans la clé du dictionnaire, la chaîne de caractères est convertie en valeur du dictionnaire.
[AWS] Que faire lorsque la commande ping provoque un "délai d'expiration"
Soyez prudent lorsque vous spécifiez la valeur d'argument par défaut dans la série Python 3
[Introduction à Python] Qu'est-ce que Python, le langage de programmation le plus puissant actuellement?
Comment donner et signifier l'option des contraintes dans scipy.optimize.minimize
[Python] Temps d'exécution lorsqu'une fonction est saisie dans une valeur de dictionnaire
Spécification du fuseau horaire lors de la conversion d'une chaîne de caractères en type datetime avec python
Comment utiliser l'astérisque (*) en Python. C'est peut-être tout? ..
Que faire si un avertissement de plate-forme non sécurisée apparaît lors de l'exécution de Python