Das Hinzufügen des UUID-Typs zu Cerberus führt zum Fehler BAD_TYPE

AlexLordThorsen

Ich versuche, Cerberus benutzerdefinierte Datentypen hinzuzufügen . Die UUID-Klasse funktioniert wie erwartet (es ist eine Standardbibliotheksklasse), aber ich kann mit Cerberus nicht mit dem UUID-Typ validieren.

Zweitens konnte ich nicht mehrere Typen in einer __init__Funktion registrieren, aber das sollte wahrscheinlich eine eigene Frage sein.

Hier ist mein benutzerdefinierter Validator, der die angegebenen Typen registrieren sollte.

import cerberus

class UUID:
    name = "UUID"

    def __init__(self, potential_uuid: str):
        self.uuid = uuid.UUID(potential_uuid)

    def __str__(self):
        return str(self.uuid)

class Validator(cerberus.Validator):
    def _register_types(self) -> cerberus.Validator.types_mapping:
        types_mapping = Validator.types_mapping.copy()
        for schema_type in datatypes.ALL_TYPES:
            cerberus_type = cerberus.TypeDefinition(
                schema_type.name,
                (schema_type,),
                ())
            types_mapping[schema_type.name] = cerberus_type
        return types_mapping

    cerberus_type = cerberus.TypeDefinition(
        "UUID",
        (datatypes.UUID,),
        ())
    types_mapping = cerberus.Validator.types_mapping.copy()
    types_mapping["UUID"] = cerberus_type

    #def __init__(self, *args, **kwargs ):
    #    types_mapping = self._register_types()
    #    super().__init__(*args, **kwargs)

Und hier sind meine Unit-Tests für diesen Code.

@pytest.mark.unit
def test_valid_uuid():
    test_input = "35d6d5a0-6f37-4794-a493-2712eda41c1a"
    actual = UUID(test_input)
    assert str(actual) == "35d6d5a0-6f37-4794-a493-2712eda41c1a"

@pytest.mark.unit
def test_invalid_uuid():
    test_input = "Not a Valid UUID"
    with pytest.raises(ValueError):
        actual = UUID(test_input) 

@pytest.mark.unit
def test_uuid_type_registration():
    test_schema = {"test_name": {"type": "UUID"}}
    validator = Validator(test_schema)
    test_record = {"test_name": "35d6d5a0-6f37-4794-a493-2712eda41c1a"}
    result = validator.validate(test_record)
    print(validator._errors)
    assert result == True

Wenn wir der UUID-Klasse nur eine gültige UUID geben, ist sie erfolgreich, aber wenn wir versuchen, sie über Cerberus zu validieren, erhalten wir einen BAD_TYPEValidierungsfehler.

pytest tests/test_datatypes/test_datatypes.py
============================================================================================================================= test session starts ==============================================================================================================================
platform linux -- Python 3.7.2, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
benchmark: 3.2.2 (defaults: timer=time.perf_counter disable_gc=False min_rounds=5 min_time=0.000005 max_time=1.0 calibration_precision=10 warmup=False warmup_iterations=100000)
rootdir: /home/vdev, inifile: setup.cfg
plugins: cov-2.6.1, benchmark-3.2.2
collected 4 items

tests/test_datatypes/test_datatypes.py ...F                                                                                                                                                                                                                              [100%]

=================================================================================================================================== FAILURES ===================================================================================================================================
_________________________________________________________________________________________________________________________ test_uuid_type_registration __________________________________________________________________________________________________________________________

    @pytest.mark.unit
    def test_uuid_type_registration():
        test_schema = {"test_name": {"type": "UUID"}}
        validator = Validator(test_schema)
        test_record = {"test_name": "35d6d5a0-6f37-4794-a493-2712eda41c1a"}
        result = validator.validate(test_record)
        print(validator._errors)
>       assert result == True
E       assert False == True

tests/test_datatypes/test_datatypes.py:30: AssertionError
----------------------------------------------------------------------------------------------------------------------------- Captured stdout call -----------------------------------------------------------------------------------------------------------------------------
[ValidationError @ 0x7fa477e10278 ( document_path=('test_name',),schema_path=('test_name', 'type'),code=0x24,constraint="UUID",value="35d6d5a0-6f37-4794-a493-2712eda41c1a",info=() )]
=============================================================================================================================== warnings summary ===============================================================================================================================
/usr/local/lib/python3.7/site-packages/cerberus/validator.py:14
/usr/local/lib/python3.7/site-packages/cerberus/validator.py:14
/usr/local/lib/python3.7/site-packages/cerberus/validator.py:14
/usr/local/lib/python3.7/site-packages/cerberus/validator.py:14
  /usr/local/lib/python3.7/site-packages/cerberus/validator.py:14: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
    from collections import Hashable, Iterable, Mapping, Sequence

/usr/local/lib/python3.7/site-packages/cerberus/errors.py:6
  /usr/local/lib/python3.7/site-packages/cerberus/errors.py:6: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
    from collections import defaultdict, namedtuple, MutableMapping

/usr/local/lib/python3.7/site-packages/cerberus/schema.py:3
  /usr/local/lib/python3.7/site-packages/cerberus/schema.py:3: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
    from collections import (Callable, Hashable, Iterable, Mapping,

-- Docs: https://docs.pytest.org/en/latest/warnings.html
================================================================================================================ 1 failed, 3 passed, 6 warnings in 0.33 seconds ===============================================================================================================

BEARBEITEN 1

Vereinfachter Beispielcode

import cerberus
import uuid


class Validator(cerberus.Validator):
    types_mapping = {
        **cerberus.Validator.types_mapping,
        'UUID': cerberus.TypeDefinition('UUID', (uuid.UUID,), ())
    }

Gleicher Fehler

    @pytest.mark.unit
    def test_uuid_type_registration():
        test_schema = {"test_name": {"type": "UUID"}}
        validator = es_client.Validator(test_schema)
        test_record = {"test_name": "35d6d5a0-6f37-4794-a493-2712eda41c1a"}
        result = validator.validate(test_record)
        print(validator._errors)
>       assert result == True
E       assert False == True

tests/test_datatypes/test_datatypes.py:30: AssertionError
------------------------------------------------------------ Captured stdout call -------------------------------------------------------------
[ValidationError @ 0x7fd9cdeed0b8 ( document_path=('test_name',),schema_path=('test_name', 'type'),code=0x24,constraint="UUID",value="35d6d5a0-6f37-4794-a493-2712eda41c1a",info=() )]
Funky-Zukunft

Könnten Sie erklären, was die _register_typesMethode tun soll und wann sie aufgerufen wird?

Das funktioniert, vielleicht hilft es dir, deinen Fehler zu finden:

def test_issue_475():
    class UUID:
        def __init__(self, data):
            self.data = data

    class MyValidator(Validator):
        types_mapping = {
            **Validator.types_mapping,
            'UUID': TypeDefinition('UUID', (UUID,), ())
        }

    assert_success(
        {'field': UUID(0)},
        {'field': {'type': 'UUID'}},
        validator=MyValidator()
    )

Beachten Sie, dass Sie die UUIDKlasse der sdtlib erwähnen, während Sie in Ihrem Beispiel eine andere mit demselben Namen implementieren.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Das Hinzufügen des zweiten Kindes zum Supervisor führt zu einem Fehler

Das Hinzufügen einer Pfeilfunktion zum Eingabefeld führt zu einem Fehler

Das Hinzufügen eines Bildes zum Element mit appendChild führt zu einem Fehler

Das Hinzufügen von AppCentre Pod zum xCode-Projekt führt zu einem Fehler beim Importieren von Modulen

Das Hinzufügen des Attributs [FromBody] führt zu 404

CPLEX - Das Hinzufügen von Lazy Constraints mit Variablen unterschiedlichen Typs führt zu InvalidCutException

Das explizite Festlegen des Typs im Fenster für die Gegensprechanlage in Typescript führt zu einem Fehler

Das Hinzufügen des ADO.NET-Entitätsdatenmodells zum Azure-Funktionsprojekt führt zu Ausnahmen

Die Verwendung des Schlüsselnamens zum Indexieren des Json-Objekts führt zu einem Fehler [[Schlüsselname]] kann nicht zum Indexieren des Typs 'Object' verwendet werden

Das Hinzufügen von Butterknife zum Android-Bibliotheksprojekt führt zu einem Fehler bei der Kompilierung "Paket existiert nicht" für Bibliotheksklassen

Das schnelle Hinzufügen von int zum Vektor und das Löschen führt zu Zugriffsverletzungen

Das Hinzufügen einer Formel zu einer Zelle mit einer Funktion führt zu einem Fehler

Das Hinzufügen eines Elements zu einem assoziativen Array führt zu einem Fehler - php

Das Hinzufügen eines Schlüssels zu einem Objekt durch Schleifen führt zu einem Fehler

FFMPEG: Das Hinzufügen einer Schriftart zu Video führt zu einem Fehler

Das Hinzufügen eines Tags zu einer E-Mail-Datei führt zu einem Fehler

Das Hinzufügen einer InMobi-Abhängigkeit mit einer Version wie 'number.xx' zum Android-Projekt führt zu einem Fehler

Das Hinzufügen einer if-Anweisung in einer for-Schleife führt zum Fehler "unerwartetes '}' in "}""

Das Hinzufügen einer Menüschaltfläche für die Navigationsschublade führt zu einem Fehler

Das Hinzufügen eines Abschnitts zu appsettings.json führt zum Absturz

Führt das Hinzufügen eines Elements zu einer Liste zum Kopieren der Liste oder nicht?

Das Hinzufügen der while-Schleife zum Skript führt zu Fehlern bei der Eingabe

Das Hinzufügen einer Where-Bedingung zum Zeitstempel führt zu ungeraden aggregierten Ergebnissen

Das Hinzufügen von .removeStateDidListener zu deinit führt zum Absturz der Anwendung

Das Hinzufügen der Uhrzeit zum Kalenderdatum unter Linux führt zu einem falschen Ergebnis

Das Hinzufügen von media_ids zum Twitter-API-Aufruf führt zu Authentifizierungsproblemen

Das Hinzufügen eines Arrays zum useEffect-Abhängigkeitsarray führt zu einer Endlosschleife

Das Hinzufügen von Kriterien zum Verfahren führt zu einer schlechten Leistung

Das Hinzufügen von Elementen zu einem Stapel führt zum Absturz

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv