2013-10-11 9 views
6

Gibt es eine einfache Möglichkeit, lose definierte dict-Objekte in Python nachzuahmen? Zum Beispiel, wie kann ich leicht ausdrücken, dass bei einem dict input, ich möchte überprüfen, ob jeder Wert in es entspricht einer bestimmten Meta-Definition, wie Minimum und Maximum Werte, Längen und Typen?Eine einfache Möglichkeit, lose definierte Python-Dict-Objekte nachzuahmen

Dies kann zum Beispiel beim Schreiben von Tests hilfreich sein.

In mock (unittest.mock in Python-Versionen 3.3+) kann man festlegen, dass ein Wert ANY Wert sein kann, wie in

>>> mock = Mock(return_value=None) 
>>> mock('foo', bar=object()) 
>>> mock.assert_called_once_with('foo', bar=ANY) 

Was aber, wenn bar oben sollte ein dict-ähnliches Objekt sein, wie

>>> {'baz': <an integer between -3 and 14>, 'qux': <'yes' or 'no'>} 

Antwort

5

ich habe tatsächlich AnyValid geschrieben, eine minimale Bibliothek, die das große Werk in formencode und unittest.mock umgesetzt nutzt, zu handhaben wie zur Fälle.

Zum Beispiel Testen eines dict Objekts wie oben beschrieben, kann dann als

>>> from mock import Mock 
>>> from any_valid import AnyValid, Int, OneOf 
>>> valid_bar = { 
...  'baz': AnyValid(Int(min=-3, max=14)), 
...  'qux': AnyValid(OneOf(['yes', 'no'])), 
...  } 
>>> mock = Mock(return_value=None) 
>>> mock('foo', bar={'baz': 4, 'qux': 'yes'}) 
>>> mock.assert_called_once_with('foo', bar=valid_bar) 
>>> 

ausgedrückt werden, da AnyValid wird jeden validator aus der großen Menge von validators in formencode nehmen können, kann viele andere Bedingungen in angegeben werden, eine ähnlich ausdrucksvolle Art und Weise.

+0

9 Minuten, um eine Bibliothek zu schreiben, nett –

Verwandte Themen