(nettipäiväkirja 19.11.2014) Maailma muuttuu huomaamatta pikku hiljaa paremmaksi. Nykyään alkaa esimerkiksi tietorakenteille olla olemassa aika vakiintunut, kieliriippumaton serialisointiformaatti, JSON. JSON ei edes ole hirveän huono, en itse asiassa ole kuullut mitään valitusta siitä. Netistä löytyy valitusta jos oikein etsii, mutta useimmat niistä alkavat maininnalla "älkää nyt ymmärtäkö väärin, JSON on mahtava siinä mihin se on suunniteltu...".
Meillä on monia hyviä käytäntöjä ja niitä tulee koko ajan lisää. Tällainen kehitys on hidasta, koska joskus yleistynyt käytäntö ei ole kovin hyvä (XML tai RCS-versionhallinta, esimerkiksi?) ja vanhojen käytäntöjen korvaaminen uusilla on paljon hitaampaa kuin uuden luominen. Mutta kaikkeen kehittyy käytäntöjä yhtaikaa, ja niinpä meillä on loppujen lopuksi aika paljon valmista hyvää; katso virtues of the Unix shell.
Kun JSON on mainittu, pitää tietysti mainita myös YAML.
Löysin muuten JSONin ongelmia etsiessäni uskomattoman ruman näppylän, jonka joku oli onnistunut löytämään Pythonista. Tämä on taas sarjassamme "anteeksi, luulin että tätä kieltä oli suunniteltu?":
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) >>> {True: 'true', 1: '1', 0: '0', False: 'false'} {0: 'false', True: '1'}
Mitä helvettiä?
Tämä artikkeli oli kommentteineen niin mielenkiintoinen, että taidan linkittää sen tänne. https://news.ycombinator.com/item?id=3834773
Elakim: Eiks se oo ihan jossain määritetty, että True on sama kuin 1 ja False on sama kuin 0? Ja toi dictionaryn arvojen asetus menee järjestyksessä, että oikeanpuolimmainen asetus samalle avaimelle jää voimaan?
Python 2.7.3 (default, Mar 13 2014, 11:03:55) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> True==1 True >>> False==0 True >>> {'a': 'b', 'a': 'c'} {'a': 'c'} >>>
atehwa: Ai niin, piti vastata tähän. Ei se ihan niin mene.
Python 2.7.3 (default, Mar 13 2014, 11:03:55) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> False is 0 False >>> True is 1 False
Aikoinaan True ja False olivat muuttujia, joiden arvot olivat 1 ja 0, mutta siitä on pitkä aika. Nykyään ne ovat omia olioitaan, jotka numeroiksi muutettuina ovat sitten 1 ja 0. On luonnollista, ettei samassa hajautuksessa voi olla avaimena sekä False että 0 ilman, että vanhat skriptit menevät rikki. Se WTF tässä on se, että esim. jos määrittää 0-avaimen hajautukseen jossa on jo False-avain, Python jättää avaimen Falseksi (eikä korvaa sitä 0:lla) mutta silti ylikirjoittaa sen arvon.
>>> [hash(_) for _ in (0,1,False,True)] [0, 1, 0, 1]
Mutta hash-vertailun lisäksi Pythonin täytyy joka tapauksessa verrata myös avainten identiteettiä. False ja True on siis täytynyt toteuttaa erityistapauksina, mutta ne on toteutettu omituisesti.