2015-01-23 4 views
17

W Pythonie podczas otwierania pliku używamy 'r', aby wskazać tylko do odczytu i 'w' tylko do zapisu. Następnie używamy 'r+' do oznaczenia "czytaj i pisz".Dlaczego w pythonie "r +", a nie "rw" oznacza "czytaj i pisz"?

Dlaczego nie używać 'rw'? Czy 'rw' nie wygląda bardziej naturalnie niż 'r+'?


Edycja na Jan. 25:

Oh .. Chyba moje pytanie wygląda trochę mylące .. Co starałem się zadać to: 'r' jest pierwsza litera „czytać” i 'w' pierwsza litera "write", więc 'r' i 'w' wyglądają naturalnie, aby odwzorować na "odczyt" i "zapis". Jednakże, jeśli chodzi o "odczyt i zapis", Python używa "r +" zamiast 'rw'.

Pytanie dotyczy więc racjonalnego nazewnictwa zamiast różnic w zachowaniu między nimi.

+5

Należy zauważyć, że 'r +,' w + 'i' a + 'wszystkie oznaczają" odczyt i zapis ", ale mają subtelności. 'r +' nie tworzy pliku, 'w +' robi, 'a +' dołącza do pliku i tworzy, jeśli nie istnieje. Chwytające "rw" byłoby w tym względzie niejednoznaczne. 'wr' nie przeczyta tak czysto, a' aw' lub 'ar' jest po prostu dziwne. – Rapptz

Odpowiedz

31

Python kopiuje tryby z C's fopen() call. r+ jest tym, czego używa C, a Python utknął w 40-letniej konwencji.

+4

Należy zauważyć, że istnieje również w + i a +. Można je nazwać wr i ar, ale myślę, że ktoś pomyślał, że r +, w + i a + było jakoś lepiej. To nie tak, że możesz je dowolnie łączyć i nadal mieć to sens. Na przykład aw nie miałoby sensu. Tak więc posiadanie innej nazwy dla każdego trybu ma więcej sensu niż pozwolenie na łączenie trybów. –

+9

'r +', 'w +' i 'a +' robią trzy różne rzeczy, i - 'fopen' jest jednym z * naprawdę starych * bibliotek C interfejsów - oryginalna implementacja prawdopodobnie zrobiła coś bezsensownego jeśli przeszedłeś' rw' , więc C89 właśnie zabroniło ci tego robić. Funkcja POSIX 'open' z trzema opcjami:' O_RDONLY', 'O_WRONLY',' O_RDWR', a następnie grupa modyfikatorów zawsze wydawała mi się bardziej ergonomicznym projektem. – zwol

+1

Pojawia się zatem pytanie: "W C, dlaczego" r + ", a nie" rw "oznacza" czytaj i pisz "?" –

-1

To co się dzieje:

>>> f1 = open("blabla.txt", 'rw'); 
    Python 3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:18:40) [MSC v.1600 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> f1=open("blabla.txt",'rw') 
Traceback (most recent call last): 
    File "<pyshell#0>", line 1, in <module> 
    f1=open("blabla.text",'rw') 
ValueError: must have exactly one of create/read/write/append mode 

To tylko sposób odczytu/zapisu/dołączania funkcja jest skonfigurowana w podstawowej pytona. Niektórzy powiedzą, że ma do czynienia ze starym stylu C fopen() Dyrektywy „R” „W” „r +” itd

+9

"to nie jest' rw', ponieważ 'rw' nie działa" jest rozumowaniem kołowym ... – immibis

+3

@immibis Prawdopodobnie tak samo jest "to" rw ", ponieważ tak właśnie zrobił C". – imallett

+0

Przypuszczam, że innym argumentem jest "Fundacja Pythona po prostu nie chciała mieć tego w inny sposób"? – ha9u63ar

0

Nie wziął go jako czystego angielsku, r+ oznacza read extended właściwie Python!=English. Wszystkie z języki mają podstawowe zasady, a @John Kugelman wspomniał, Python utknął ze starym.

+5

@WChargin Zależy, możesz tego nie chcieć, jeśli oba 'Python' i' English' są zmiennymi, ponieważ robisz porównanie id. –

+0

@ ıɯɐƃoʇǝızuǝʞ True. Jednak niektóre języki (przynajmniej C i Java) używają '==' wyłącznie dla id/reference equality. C++ i C# i inne pozwalają przeciążać '==' dla równości wartości. Tak więc wydaje mi się to wykonalne. – wchargin

Powiązane problemy