2016-02-28 17 views
8

ich habe folgendes doctest x.doctest geschrieben:doctest nicht erkennen __future __ Division

This is something: 

    >>> x = 3 + 4 

foo bar something else: 

    >>> from __future__ import division 
    >>> y = 15 
    >>> z = int('24') 
    >>> m = z/y 
    >>> print (m) 
    1.6 

Aber wenn ich python -m doctest x.doctest lief auf Python 2.7.11, die doctest nicht from __future__ import division erkannte:

********************************************************************** 
File "x.doctest", line 11, in x.doctest 
Failed example: 
    print (m) 
Expected: 
    1.6 
Got: 
    1 
********************************************************************** 
1 items had failures: 
    1 of 6 in x.doctest 
***Test Failed*** 1 failures. 

Selbst wenn ich die zukünftige Importanweisung in die erste Zeile verschoben habe:

Die doctest immer noch nicht:

********************************************************************** 
File "x.doctest", line 11, in x.doctest 
Failed example: 
    print (m) 
Expected: 
    1.6 
Got: 
    1 
********************************************************************** 
1 items had failures: 
    1 of 6 in x.doctest 
***Test Failed*** 1 failures. 

Warum das so ist und wie kann ich dieses Problem lösen?

Gibt es eine Markierung/Option für Doctest, die sicherstellt, dass from __future__ import division erkannt wird?

Hinweis: Ich könnte nur die Prüfung auf print (int(m)) oder y = 15. erzwingen und der Doctest wird bestanden, aber das ist nicht so wünschenswert.

Antwort

3

Doctests führen jede Zeile isoliert durch den Python-Compiler. Dies bedeutet, dass alle Compiler-Flags, die mit einer -Statement im Doctest selbst angegeben sind, in einem Doctest unbrauchbar sind.

Sie können jedoch Namen aus dem echten __future__ module zu Ihrem doctest globals hinzufügen. Wenn Sie das tun nicht das from __future__ import <name> Format verwenden, aber import __future__ stattdessen verwenden, importieren Sie, dass die tatsächlichen Modul und können Referenzen hinzufügen, auf die Objekte, die es zu den doctest globs oder extraglobs Wörterbücher definiert:

if __name__ == "__main__": 
    import doctest 
    import __future__ 
    doctest.testmod(extraglobs={'division': __future__.division}) 

Die DocTestRunner wird dann Setzen Sie die richtigen Compiler-Flags für Sie, wenn Sie daraus einzelne Zeilen erstellen.

Demo:

>>> import doctest 
>>> import __future__ 
>>> import sys 
>>> def foo(): 
...  """ 
...  >>> 1/2 
...  0.5 
...  """ 
... 
>>> doctest.testmod(sys.modules['__main__']) 
********************************************************************** 
File "__main__", line 3, in __main__.foo 
Failed example: 
    1/2 
Expected: 
    0.5 
Got: 
    0 
********************************************************************** 
1 items had failures: 
    1 of 1 in __main__.foo 
***Test Failed*** 1 failures. 
TestResults(failed=1, attempted=1) 
>>> doctest.testmod(sys.modules['__main__'], extraglobs={'division': __future__.division}) 
TestResults(failed=0, attempted=1) 
+0

Nur um einige Fakten zu bestätigen, könnte der 'if __name__ == 'main':' Trick nur in einer 'x.py' Datei und nicht in einem' x.doctest' funktionieren, oder? – alvas

+1

@alvas: Ich bin nicht vertraut mit .doctest Dateien. Ich vermute, dass Ihr Projekt diese explizit irgendwo mit einer 'DocFileSuite()' -Instanz lädt; setze die Globals auf * that *. –

+0

@alvas: Der Code, der diese Dateien lädt, könnte selbst eine Parsing-Logik ausführen, um den Globals Kompilierflags basierend auf den Dateiinhalten hinzuzufügen. –

1

Sie können die Option -Q für den Python-Interpreter verwenden. Setzen Sie ihn auf new:

python -Qnew -m doctest x.doctest 

Hilfe auf Python Kommandozeilen-Optionen mit:

python -h 

Ausgewählte Ausgabe:

-Q arg: Division Optionen: -Qold (Standard), - Qwarn, -Qwarnall, -Qnew

Weitere Informationen zur Detailansicht here.

+0

Dank, haben Sie einen Link auf die '-Q' Dokumentation haben? Gibt es eine Möglichkeit, dies mit einem '#doctest:' Kommentar innerhalb der 'x.doctest' Datei zu tun? – alvas

+1

Ein Hilfe-Link wurde hinzugefügt.Mir sind keine '#doctest:' Direktiven dafür bekannt. Auf Unix-basierten Systemen können Sie Ihrer Datei einen Shebang hinzufügen: '#!/Usr/bin/env python -Qnew -m doctest' und mit'./X.doctest' ausführen. –

+0

'-Qnew' ist eine globale Änderung, die sogar Code beeinflusst, der keine echte Division verwenden sollte. Die [PEP] (https://www.python.org/dev/peps/pep-0238/), die eine echte Division einführte, sagt, dass "-Qnew" nur für Bildungskontexte gedacht ist, in denen die Instruktoren eine echte Trennung wollen, aber nicht wollen die Schüler müssen in ihrem gesamten Code "from __future__ import division" einfügen. – user2357112