Nasz zespół musi fragmentować się poniżej:

To:

buf = StringIO.StringIO()
gzip.GzipFile(fileobj=buf, mode='wb').write(foo)
...

I ten:

buf = StringIO.StringIO()
tmp = gzip.GzipFile(fileobj=buf, mode='wb')
tmp.write(foo)
...

Który jest bardziej pytalony?

Edytowane: Próbuję / połów, aby wykonać pracę w obsłudze błędów, ale który jest bardziej pytaniowy?

3
dennisyuan 30 lipiec 2012, 15:19

3 odpowiedzi

Najlepsza odpowiedź

Albo jest w porządku. Wybierz ten, który ma być najbardziej czytelny.

Osobiście pójdę z pierwszym, korzystanie z dodatkowej zmiennej nie dodaje niczego dla mnie .

Mówi się, że w tym kontekście Ecatmur jest poprawny, abyś mógł zamknąć instancję GZipFile po napisaniu wszystkich danych do niego, ponieważ spłukuje dane kompresyjne do buf i dodaje informacje GZIP CRC i informacje o rozmiarze. Bez tego Twoje dane są potencjalnie niekompletne!

3
Martijn Pieters 30 lipiec 2012, 11:32

Musisz zamknąć obiekt GzipFile po zakończeniu go, więc jednorazowa linia nie będzie działać. Zamiast tego użyj wyrażenia menedżera kontekstu:

buf = StringIO.StringIO()
with gzip.GzipFile(fileobj=buf, mode='wb') as tmp:
    tmp.write(foo)

One-liner gzip.GzipFile(fileobj=buf, mode='wb').write(foo) jest bardzo niebezpieczna , ponieważ zależy od zebranych śmieci na końcu wyrażenia, dzięki czemu strumień jest przepłukany. Jeśli nie nastąpi to (np. Za pomocą Jythona), a następnie buf nie będzie zawierać oczekiwanego wyniku.

11
ecatmur 30 lipiec 2012, 11:26

Na przykład,

Man.eat.work.sleep()

Metody łańcuchowe są powszechne w Ruby / JavaScript, myślę, że jest to więcej ruby/javascript style nie pythonic.

0
iMom0 30 lipiec 2012, 12:17