FANDOM


ÉPÍTÉS ALATT!

Addig is: Hivatalos dokumentáció Sorting HOWTO


A locale modul használata a magyar ékezetes szövegek rendezésébenSzerkesztés

A locale modul a területi beállításokat teszi elérhetővé a programunk számára, a C nyelvi implementációt követve. Az alábbi példában az ékezetes rendezés kulimászába mászunk bele.

>>> névsor=['Ödön','Laci', 'Ádám', 'Zoli', 'Albert', 'Éva']
>>> sorted(névsor)
['Albert', 'Laci', 'Zoli', 'Ádám', 'Éva', 'Ödön']

Az történt, ami szokott: elöl vannak az ékezet nélküli betűk, s a Z után kezdődnek az ékezetesek. Most importáljuk a locale modult, és adjuk meg az ott definiált strxfrm() függvényt rendezési kulcsnak.

>>> import locale
>>> sorted(névsor, key=locale.strxfrm)
['Albert', 'Laci', 'Zoli', 'Ádám', 'Éva', 'Ödön']

Meglepetésünkre most sem rendezi helyesen. Ellenőrizzük, hogy érzékelte-e a gép a nyelvi beállításokat:

>>> locale.getlocale() #Ez gépenként változhat
('Hungarian_Hungary', '1250')
>>> sorted(névsor, key=locale.strxfrm)
['Albert', 'Laci', 'Zoli', 'Ádám', 'Éva', 'Ödön']

Látszólag igen, felismerte a magyar környezetet, de mégsem. Ezen a ponton nem segíthet más, csak a jó öreg RTFM! A most következő sort minden programban explicite meg kell adni! Még akkor is, ha látszólag felismerte a program a magyar beállításokat.

>>> locale.setlocale(locale.LC_ALL, '') 
'Hungarian_Hungary.1250'
>>> sorted(névsor, key=locale.strxfrm)
['Ádám', 'Albert', 'Éva', 'Laci', 'Ödön', 'Zoli']

Örömünk azonban ne legyen teljes! Bár a grafikus képernyőn sikerült végre helyesen rendezni a névsort, a karakteres konzolon furcsa jelenséget tapasztalhatunk:

>>> sorted(névsor, key=locale.strxfrm)
['ud m', 'Albert', '?va', 'Laci', 'td"n', 'Zoli']

Vagyis a rendezési sorrend megfelelő, csak éppen az ékezetes betűinket veszítettük el. Ugyanilyen ronda az eredmény, ha rendezés nélkül íratjuk ki az eredeti névsort a setlocale használata után:

>>> névsor
['td"n', 'Laci', 'ud m', 'Zoli', 'Albert', '?va']

A következő paranccsal kísérletezhetünk:

>>> locale.setlocale(2,('Hungarian_Hungary','850'))
'Hungarian_Hungary.850'
>>> névsor
['Ödön', 'Laci', 'Ádám', 'Zoli', 'Albert', 'Éva']
>>> sorted(névsor, key=locale.strxfrm)
['Ádám', 'Albert', 'Éva', 'Laci', 'Ödön', 'Zoli']

Éééééés lőn! Hurrá! (A 852 is jónak látszik.) A fenti parancsban a 2 a kategória sorszáma, jelesül a karaktereké. (Ezt az importálás után a help(locale) parancsra megjelenő súgóból lehet kibányászni.)

Úgy tűnik, sikerült megtalálni azt a pontot, ahol már a Pythonnak sem mindegy, hogy GUI vagy konzolos alkalmazásként használjuk. Amennyiben büntetőjogi felelősségünk tudatában ki merjük jelenteni, hogy a rendezendő adatainkban csak alfanumerikus jelek vannak, mindenféle ürdöngtől való krikszkrakszok nélkül, esetleg egyszerűbb lehet egy saját kulcsfüggvény írása, ami garantáltan eszközfüggetlen lesz, mert a locale sötét verem. De aki tud róla valami bölcsebbet mondani, az szóljon! :-)

Ha több modulból álló vagy több szálon futó programot írunk, feltétlenül rágjuk át magunkat a lenti dokumentáción, mielőtt ezt a modult használjuk!

Hivatalos dokumentáció A locale modul dokumentációja

Ez a szócikk forráskódot tartalmaz, amely egy WikiMedia-kiegészítés segítségével olyan színesen jeleníthető meg, mint például ebben a Wikipédia-cikkben. A kiegészítést a Wikia-stáb ígérete szerint 2010 végéig frissítik, addig türelmet kérünk a fapados kinézet miatt.

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

A Wikia-hálózat

Véletlen wiki