Was tun, wenn der Werttyp in Python nicht eindeutig ist?

Was ist, wenn Sie manchmal nicht garantieren oder nachweisen können, dass Sie 100% Kontrolle über die Art eines Wertes haben?

Gibt es eine bequeme Möglichkeit zum Schreiben, z. B. eine Typinferenz? Wenn jemand weiß, lassen Sie es mich bitte wissen. Ist es möglich, Diktat in Struktur umzuwandeln? Was ist gut? Ich fand, dass der mehrdeutige Typ nervig war **, also beschloss ich, noch einmal darüber nachzudenken.

Beispiel

Angenommen, Sie haben Diktierdaten mit dem Namen "Test" wie im folgenden Beispiel. Ich möchte überprüfen, ob der Schlüssel jedes Werts der Variablen "test" eine "1" enthält.

test_dict_key_value_type.py


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

#Muster 1 Verwenden Sie diese Instanz, um den Typ zu überprüfen und mit get zu bestimmen
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!'


#Muster 2 Bereiten Sie eine Funktion zum Neudefinieren der Daten vor
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_Da alle Testschlüsselwerte diktiert sind, können sie nur mit der get-Methode verwendet werden.
for k, v in set_default_dict_value_type(test.copy(), 'key', list).iteritems():
    if 1 in v.get('key'):
        print k, ':found!'


#Muster 3 Versuchen Sie es und ignorieren Sie es
for k, v in test.iteritems():
    try:
        if 1 in v.get('key'):
            print k, ':found!'
    except:
        pass

Versuche zu rennen

bash


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

Zusammenfassung

In diesem Fall besteht das Problem darin, dass die Definition von Daten nicht eindeutig ist **, wenn Sie sorgfältig darüber nachdenken. Also kam ich zu dem Schluss, dass ** eine Neudefinition des Datentyps das Problem lösen würde **. Mit anderen Worten, wenn sich der Typ vom Zeitplan unterscheidet, wird davon ausgegangen, dass die Daten beschädigt sind, und es ist in Ordnung, den Typ neu zu definieren. Im obigen Fall ist "Fall 2" in dieser Phase das bevorzugte Verfahren.

Aufgabe

Beispielmodul

Ich habe ein Beispielmodul erstellt, das Liste und Diktat überprüft. Gibt es noch Verbesserungen?

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

Was tun, wenn der Werttyp in Python nicht eindeutig ist?
Was tun, wenn in der Anaconda-Umgebung die Warnung "Die Umgebung ist konsistent ..." angezeigt wird
[Python] Typ Fehler: 'WebElement'-Objekt ist nicht iterierbar Was tun, wenn ein Fehler auftritt?
Was zu tun ist, wenn es nicht in der Sudoers-Datei enthalten ist. Dieser Vorfall wird gemeldet.
Was tun, wenn nur das Fenster angezeigt wird und im Pygame nichts angezeigt wird?
Was tun, wenn der Fortschrittsbalken in tqdm von Python nicht angezeigt wird?
Was ist "Mahjong" in der Python-Bibliothek? ??
Was tun, wenn ModuleNotFoundError: In Python tritt kein Modul mit dem Namen 'XXX' auf
Was ist im Docker Python-Image pfeifend?
Was tun, um eine Google-Tabelle in Python zu erhalten?
Was tun, wenn in python json .dumps eine Dezimalstelle enthalten ist?
[Python] Was ist ein formales Argument? So stellen Sie den Anfangswert ein
[Python] Was tun, wenn ein Fehler im Zusammenhang mit der SSL-Authentifizierung zurückgegeben wird?
Was soll ich verwenden, um Typvergleiche in Python durchzuführen?
Was tun, wenn eine Warnmeldung in der Pip-Liste angezeigt wird?
NameError: Der globale Name'dot_parser 'ist nicht definiert und was ist zu tun, wenn er in Python angezeigt wird?
Was beim Nachahmen zu tun ist, wird in Python eingebettet
[openpyxl] Was tun, wenn IllegalCharacterError in pandas.DataFrame.to_excel angezeigt wird?
curl: (60) Was tun, wenn das Ausstellerzertifikat ungültig ist?
Was tun, wenn ValueError, "nicht unterstützter Hash-Typ" ausgelöst wird?
Was tun, wenn eine Warnung zur Python-Integration in Neovims CheckHealth angezeigt wird?
So schreiben Sie, was zu tun ist, wenn die Anwendung zum ersten Mal in Qt for Python mit Designer angezeigt wird
Was tun, wenn PyInstaller3.5 einen Fehler in Python3.8 verursacht (TypeError: Eine Ganzzahl ist erforderlich (Typbytes erhalten))
Was tun, wenn "Name xxx nicht importiert werden kann" [Python]
Was tun, wenn bei der Eingabe eines Kameravideos in OpenCV ein Abbruch angezeigt wird?
Was tun, wenn das Diagramm nicht auf dem Jupyter-Notizbuch (Ipython) angezeigt wird?
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Ich möchte am Ende etwas mit Python machen
Was tun, wenn python3 venv auf Raspberry Pi nicht gut funktioniert?
[Python] Was tun, wenn beim Erstellen von Exe mit PyInstaller kein Modul mit dem Namen "pyproj.datadir" angezeigt wird?
Was tun, wenn der Druckbefehl selbst einen Fehler in Mayas Python verursacht?
Was tun, wenn beim Importieren von matplotlib in Python (Mac) eine Fehlermeldung angezeigt wird?
Was tun, wenn Pythons IntelliSense in VS Code unter Windows nicht angezeigt wird?
[Einführung in Python] Was ist das wichtige "if __name__ == '__ main__':" beim Umgang mit Modulen?
Was tun, wenn Python in pyenv nicht von der Systemversion wechselt?
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Was tun, wenn `Argumente [0] .scrollIntoView ();` in Python-Selen fehlschlägt?
Verfahren, die durchgeführt werden müssen, wenn Japanisch nicht in matplotlib angezeigt wird
Den Typ mit Python beherrschen? (Wann ist eine Typprüfung durchzuführen?)
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Was tun, wenn in Django "Ungültiger HTTP_HOST-Header" angezeigt wird?
[Python] Was ist @? (Über Dekorateure)
Im Python-Befehl zeigt Python auf Python3.8
[Python] Was ist der sortierte Schlüssel?
Was tun, wenn der Fehler RuntimeError angezeigt wird: Python wird nicht als Framework installiert, wenn Sie versuchen, matplitlib und pylab in Python 3.3 zu verwenden
Was tun mit PYTHON Release?
Wofür ist der Python-Unterstrich (_)?
Was tun, wenn das Bild nicht mit matplotlib usw. im Docker-Container angezeigt wird?
Was tun, wenn ein nicht in pom.xml definiertes Glas zu einem fehlenden Artefakt wird?
Wenn sich eine Zeichenfolge einer bestimmten Reihe im Schlüssel des Wörterbuchs befindet, wird die Zeichenfolge in den Wert des Wörterbuchs konvertiert.
[AWS] Was tun, wenn der Ping-Befehl eine "Zeitüberschreitung" verursacht?
Seien Sie vorsichtig, wenn Sie den Standardargumentwert in der Python 3-Serie angeben
[Einführung in Python] Was ist Python, die derzeit leistungsstärkste Programmiersprache?
Geben und meinen Sie die Einschränkungsoption in scipy.optimize.minimize
[Python] Ausführungszeit, wenn eine Funktion in einen Wörterbuchwert eingegeben wird
Zeitzonenspezifikation beim Konvertieren einer Zeichenfolge in einen Datums- / Uhrzeittyp mit Python
Verwendung von Sternchen (*) in Python. Vielleicht ist das alles? ..
Was tun, wenn beim Ausführen von Python eine Warnung zur unsicheren Plattform angezeigt wird?