2010-09-10 13 views
5

python2.6'daki dosya nesnelerinin bir listesini kapatmak için lambda'yı kullanarak bir kod satırı yazdım:Python3.1'de dosya işlevsel şekilde kapatılamadı mı?

map(lambda f: f.close(), files) 

Çalışıyor, fakat python3.1'de değil. Niye ya?

İşte test kodum:

import sys 

files = [sys.stdin, sys.stderr] 

for f in files: print(f.closed) # False in 2.6 & 3.1 

map(lambda o : o.close(), files) 

for f in files: print(f.closed) # True in 2.6 but False in 3.1 

for f in files: f.close()   

for f in files: print(f.closed) # True in 2.6 & 3.1 

cevap

6

map Python 2'de listesini döndürür, ancak Python 3'te bir yineleyici:

İşte benim test kodudur.

yan etkileri ile fonksiyonlara map veya benzeri "işlevsel" fonksiyonlarını hiçbir zaman uygulanmaz. Python işlevsel bir dil değildir ve asla olmayacaktır. Bir for döngü kullanın:

for o in files: 
    o.close() 
+0

Not Ayrıca 2to3 bu yakalar ve otomatik olarak acil olarak değerlendirilmesi zorlayarak, sizin için (...) harita çağrıyı listeler. –

+3

'Harita veya benzeri "işlevsel" işlevleri hiçbir zaman yan etkilere sahip fonksiyonlara uygulamayın. Python işlevsel bir dil değildir ve asla olmayacak. Python'un işlevsel bir dil olsa bile, bunun neden sağlıklı bir tavsiye olmayacağını anlamıyorum. Herhangi bir dilde, sonucu kullanmıyorsanız haritayı kullanmanın bir anlamı yoktur. – sepp2k

+0

Yalnızca işlevsel dillerdeki işlevlerin hiçbir yan etkisi yoktur, bu nedenle 'close() işlevi bulunamaz. – Philipp

4

Python 3 harita tembel yineleyici olduğu için. :

İstenilen her öğeye işlev uygulayan bir yineleyici döndürerek sonuçları elde edin.

Ör Python 3 [f(i) for i in seq] eşdeğer Python 2, map(f, seq), ama içinde bu (f(i) for i in seq) var - kurnazca farklı sözdizimi, ama çok farklı anlamlar. Harita varyantı çalışmasını yapmak için yineleyiciyi tüketmeniz gerekir. Ergo, daha basit (ve daha idiomatik: harita, anlama ve jeneratörler yan etkilere sahip olmamalı!) Açık bir for-döngüsü kullanmak için.

+1

Benim düşünceme göre, "map()' i yalnız bırakmalı ve itertools modülünü "imap()" yöntemini yerleşik olarak yapmış olmalılar. Bunun yerine, tüm 'onlar', var olan bir yapının ne yaptığını değiştirerek daha büyük bir uyumsuzluğu ortaya çıkardı. – martineau

+0

Ayrıca, harita() 'yı tek başına bırakıp' imap() 'ı yerleşik hale getirmek, "Açık olan örtük olmaktan iyidir" felsefesini daha iyi takip ederdi. – martineau