2016-03-30 22 views
2

Ben şu sonuçlar almak: piton 3.5 olarakisinstance dosya piton 2.7 ve Python 2.7 olarak 3.5

>>> with open("README.md", "r") as fin: 
...  print(isinstance(fin, file)) 
... 
True 

alıyorum:

>>> with open("README.md", "r") as fin: 
...  print(isinstance(fin, file)) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
NameError: name 'file' is not defined 

Yani, Tamam ben Python docs bakmak ve öğrenmek Python 3.5'de, dosyalar io.IOBase (veya bazı alt sınıflar) tipindedir.

>>> import io 
>>> with open("README.md", "r") as fin: 
...  print(isinstance(fin, io.IOBase)) 
... 
True 

Ama sonra Python 2.7 içinde çalıştıklarında: Bu beni Öncü

>>> import io 
>>> with open("README.md", "r") as fin: 
...  print(isinstance(fin, io.IOBase)) 
... 
False 

Yani bu noktada, kafam karıştı. documentation'a baktığımda, Python 2.7'nin True numaralı telefonu bildirmesi gerektiğini düşünüyorum. o 18:30 ET var belki de

Açıkçası ben, bir şey temel eksik, ama iki ilgili sorular vardır:

  1. Neden Python raporu Falseisinstance(fin, io.IOBase) için çalışır?
  2. Bir değişkenin hem Python 2.7 ve 3.5'da çalışacak açık bir dosya olduğunu test etmenin bir yolu var mı?
+1

"Bu, Python 2.x altında, yerleşik dosya nesnesine alternatif olarak önerilmiştir", yani 2.x'de aynı değil. –

+0

Bir bağlantınız olduğunu düşünmüyorum, bu yüzden daha fazla okuyabiliyorum, değil mi? – iLoveTux

+1

Bağladığınız sayfanın en üstünde yer alıyor. –

cevap

3
bağlantılı belgelerine

:

Under Python 2.x, this is proposed as an alternative to the built-in file object

yüzden piton 2.x. aynı değildir parçası 2 gelince

, bu, python2 ve 3 çalışır dünyada değil güzel şey olsa: python3 için python2

import types 
f = open('test.txt', 'r') # assuming this file exists 
print (isinstance(f,types.FileType)) 

için

import io 
try: 
    file_types = (file, io.IOBase) 

except NameError: 
    file_types = (io.IOBase,) 

with open("README.md", "r") as fin: 
    print(isinstance(fin, file_types)) 
+0

Sadece "isinstance" kontrolleri için olduğundan, Py3 kasasında "tuple" sarmasına gerek yoktur; sadece 'file_types = io.IOBase' işe yarar (muhtemelen biraz daha verimli). – ShadowRanger

+0

@ShadowRanger aye, ama tutarlılık için tutuldu + değişkeninin adı bir diziyi gösterir. Gerçekten ihtiyaç duyulmadıkça bu tür şeyleri optimize etmeye istekli değil. –

+2

Tamam, bu yüzden bu cevabı doğru olarak işaretliyorum çünkü bu sorunun benim için doğru cevap olduğunu düşünüyorum, ancak nihai amacım bir Python 2.7 ve 3.5 uyumlu kod tabanına sahip olmak olduğu için, aslında 'open() 'i değiştiriyorum her iki versiyonda da çalışan io.open() 'çağrılarını çağırır ve bunları aynı şekilde test edebilirsiniz. Yardım ettiğin için teşekkür ederim. Io.open kullanarak – iLoveTux

1

import io 
import types 
f1 = open('test.txt', 'r') # assuming this file exists 
f2 = open('test.txt', 'rb') # assuming this file exists 
print (isinstance(f1,io.IOBase)) 
print (isinstance(f2,io.IOBase)) 

(Düzenle: io.TextIOWrapper için önceki çözümüm test edildi, sadece metin modunda açılan dosyalarla çalıştı. Bkz.Python3 sınıf hiyerarşisini açıklayan).

+1

, 'AttributeError: module 'türlerinin' özniteliği yoktur 'FileType'' – iLoveTux

+0

aldınız. Python3'teki 'types' modülü tamamen farklıdır. –

+2

'isinstance (open ('testi.txt', 'rb'), io.TextIOWrapper) == Yanlış '. Üssü kullan, Luke ... @SciProg –