Path: csiph.com!news.swapon.de!fu-berlin.de!uni-berlin.de!not-for-mail From: Stefan Schwarzer Newsgroups: de.comp.lang.python Subject: Re: [Python-de] =?utf-8?q?einheitliches_Vorgehen_beim_=C3=96ffnen_vo?= =?utf-8?q?n_Dateien=2E?= Date: Thu, 18 Oct 2018 12:00:47 +0200 Lines: 68 Message-ID: References: <90674f1b-f3c2-04c2-f50c-f306c5ea1a88@thomas-guettler.de> <13eb3966-f92c-9bdf-db4a-072c34fdc1f4@sschwarzer.net> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de Jd68fK192VVuWl9UZxq4twbuHxIrQo/9mVrF6KQuVd0Q== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org Openpgp: preference=signencrypt Autocrypt: addr=sschwarzer@sschwarzer.net; prefer-encrypt=mutual; keydata= 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 WdtUokwYRxk= User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.24) Gecko/20100411 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 In-Reply-To: <90674f1b-f3c2-04c2-f50c-f306c5ea1a88@thomas-guettler.de> Content-Language: de-DE X-Provags-ID: V03:K1:nkFZvOsTJNPjub5PcRbK5+Ow+acGV2G4lKIs9GTCG8HN4L+/I9Q EP05pw/ZVaHaSDfDsNkEJhwrZfRXTTuItRaMsBDuPRXxXghFsUbpPEJhyzT4qDFcDLxccvI L6hGm4xDRmiNg8M6WrZTErgyCWurrJeFpFqzfhD8MC/Rf1pgQvJSAmWB0BhHRR49aN5g4L/ 7gr4THrpZqNzC8Mt9LQNg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V01:K0:mdCRG98XcRU=:0k6nV3gikGRqEmGO08KgZs mO8qGXhEYaEB5pkrPfdtfcH9rs27IAAUjTudHtbYTpWt8EIAa+UPPalV8Yjojp5XFfwk9e+Rh Zb9NBx/caAg5NrS2EN8iK3UTKCL6Jx+xpCrrc9LMUDsrcZpQp1vYjk021At59UOrX8iRydcBn GY7RzuUYiMyioPpZwO38/GdsYun2XUtK6hAkS8eoCL+NEC7t+ngpzmIMLFETZnlHLbDZgAebF B5S+67MDunhbrTBIguoUkkNvEhFuq+7o6Ir7NTjpoeQ9InL9QErrG/7O7M/ZmnPw3GxEYNi3Q fYWrEXPgS2VYjBB0LYeRiYEfGrD7l0v0cRqxbpcbVYC4MT5zaB/tinr58X2d8WoMdgOEWUIZo R+twP4If30erlcpNuV5ZFxsAjJQrbVrn2NUVbj/v+7bR64ft5B6WgOmJ6BlIJm5xex3k5kOxh 1ZuoCv10HkYprKACKdbA7kOP1OXF4iFUpqy4h+Fwr4LD0Lrc34JAh7mG3tFqE6XdI8fqs6oya IvRdjPK3kcOEi6PM/q3P6C1/speAY9SB/DvRdVuBgcuk7WcjDrmb/P4CcseAIR7c6DBzSUqa5 lUomG/ptzzSKvtf58XwfW/raNp1rJ/zLiucc1nCBL504cv7M8NNqg72/ZbVv/ksePrVcBArdG z8pS+eHJjXfQPzPDMWiBklIc/bSyZ2DqIxmC3uzTzte411oslYk29bw3idd9Img2/kssZFmyE gjTkNJ5cGrfW5P5t X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <13eb3966-f92c-9bdf-db4a-072c34fdc1f4@sschwarzer.net> X-Mailman-Original-References: <90674f1b-f3c2-04c2-f50c-f306c5ea1a88@thomas-guettler.de> Xref: csiph.com de.comp.lang.python:5288 On 18/10/2018 09.59, Thomas Güttler wrote: > So lange wir Python2 unterstützen soll io.open() verwendet werden. Ich finde Peters Vorschlag mit from io import open sympathisch, weil man dann später bei ausschließlicher Python-3-Unterstützung nur das Import-Statement löschen muss, aber sonst keinen Code ändern muss. > Wenn man nur den Inhalt braucht, dann ist diese einfache Variante zulässig (ohne with-Statement) > > content = io.open(my_file, 'rt').read() > > Auch beim Schreiben? Ich schließe mich hier den anderen nachdrücklich an: Die Datei sollte immer ordentlich geschlossen werden, egal ob beim Lesen oder Schreiben. Beim Lesen wäre das explizite Schließen vielleicht nicht ganz so wichtig, was Datenverluste angeht. Aber ich halte es trotzdem für guten Stil, explizit "hinter sich aufzuräumen". Die Verwendung eines `with`-Blocks hat auch den Vorteil, dass der Leser danach weiß, dass dieses Dateiobjekt nicht mehr für I/O verwendet wird. (Ich schätze, theoretisch kann man dann immer noch auf `.name` zugreifen, würde das aber für schlechten Stil halten.) > Die Variable wird „f“ genannt: > > with io.open(my_file, 'wt') as f: > f.write(...) Ich verwende meist `fobj`. Wenn man den Bezeichner abseits vom `with`-Block sieht, ist damit klar, dass `f` kein Dateiname ist, sondern ein Dateiobjekt. Leider werden `f` und `file` mitunter sowohl für Dateinamen (manchmal auch Pfade) als auch für Dateiobjekte verwendet. Apropos: Dateinamen bzw. -pfade benenne ich zur Abgrenzung von Dateiobjekten mit `..._name` bzw. `..._path`. > So wird das meist in der Python-Doku gemacht: Bsp: Methods of File Objects Ich glaube, mit Bezeichnern (und anderen Konventionen) in der Python-Doku und Tutorials sollte man immer vorsichtig sein. Da geht es ja normalerweise darum, "mal eben" etwas zu zeigen. Das heißt aber nicht, dass man dieselben Muster für Produktions-Code verwenden sollte. > Der with-Block nach dem Open sollte kurz sein. Also nicht länger etwa 6 Zeilen. Lieber ein langer `with`-Block als keine sauber geschlossenen Dateien. ;-) Aber ja, lange Blöcke machen den Code leicht unübersichtlich, vor allem wenn sie verschachtelt sind. Im Zweifelsfall fände ich aber einen längeren `with`-Block besser als den Code besonders kompakt zu schreiben, nur um unter dem Zeilen-Limit zu bleiben. Viele Grüße Stefan