2016-07-08 22 views
0

Wie Sie in "Mann Python" lesen:Sollte ich "python -3" vertrauen, um ein vollständiges Ergebnis zu erhalten?

-3 warnen Python 3.x Inkompatibilitäten, die 2to3 beheben nicht trivialer können.

Dieser Befehl mir allready in der Vergangenheit helfen, für Python 2.x & 3.x. Inkompatibilität zwischen Code zu vermeiden

Allerdings habe ich keine Warnung für this Code. Sollte ich "Python-3" als ein erschöpfendes Ergebnis zurückgeben?

Hinweis: Es gibt keine Erwähnung dieser Option here.

+1

Da dieser Code nicht mit 3.x kompatibel ist. Es sei denn Sie meinen '__nonzero__'? In diesem Fall ist es wahrscheinlich, weil es nach "Inkompatibilitäten sucht, die 2to3 nicht trivial ** reparieren" kann, und das ist eine ziemlich triviale Lösung. Es ist unklar, über welchen Code du sprichst. –

+0

Ihr Link führt zur Python 3-Dokumentation. Python 3 hat dieses Flag nicht. (Überraschenderweise wird in der [Python 2-Dokumentation] (https://docs.python.org/2/using/cmdline.html#cmdoption-3) der Vorbehalt von 2to3 nicht erwähnt.) – user2357112

+0

@ user2357112 - Yeah, I ' Auch davon bin ich überrascht (weshalb meine erste Antwort Code hatte, den 2to3 trivial behandelt). – mgilson

Antwort

2

Nein, Sie sollten diese Warnung nicht als erschöpfend behandeln. Der folgende Code verhält sich anders auf Python2.x und python3.x aber sendet keine Warnungen:

from __future__ import print_function 

class test(object): 
    def __nonzero__(self): 
     return False 

t = test() 
if t: 
    print('Hello') 

(zumindest nicht so von python2.7.10 auf OSX). Ok, vielleicht kann dieser Code von 2to3 (es ist) behandelt werden - obwohl ich immer noch eine Warnung basierend auf der official documentation erwarten würde.

warnen Python 3.x möglichen Unverträglichkeiten durch eine DeprecationWarning für Features, die emittierende oder erheblich verändert in Python 3.

Hier ist ein Beispiel von Code entfernt werden, dass isn't handled by 2to3 aber noch keine Warnung ausgegeben wird mit der -3 Option:

from __future__ import print_function 

import subprocess 

class Pipe(object): 
    def __init__(self,openstr): 
     self.gnu_process=subprocess.Popen(openstr.split(), 
              stdin=subprocess.PIPE) 

    def put_in_pipe(self,mystr): 
     print(mystr, file=self.gnu_process.stdin) 

if __name__=="__main__": 
    print("This simple program just echoes what you say (control-d to exit)") 
    p = Pipe("cat -") 
    while True: 
     try: 
      inpt = raw_input() 
     except EOFError: 
      break 
     print('putting in pipe:%s' % inpt) 
     p.put_in_pipe(inpt) 

Das Problem mit diesem Code ist, dass in python3, meine Pfeife ein Byte Objekt erwartet, aber es wird immer ein str (python2.x‘ s Unicode).