Python 3.4 - jak uchovat nastavení

oTa

Python 3.4 - jak uchovat nastavení
« kdy: 23. 07. 2015, 09:57:06 »
Ahoj pánové, chtěl bych se zeptat, jak můžu uchovat nějaké nastavení po ukončení programu pro příští spuštění. Mám třídu a v ní mám 3 proměnné, které potřebuji uchovat.
Kód: [Vybrat]
self.rgb = 1
self.bck = 1
self.txt = 45
Neporadil by mi prosím někdo ? Děkuji za pomoc.


mhepp

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #1 kdy: 23. 07. 2015, 10:29:06 »
Co třeba použít JSON -- knihovny jsou připravené a budeš mít validaci vstupu v ceně

karel

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #2 kdy: 23. 07. 2015, 11:26:35 »
pickle

frk

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #3 kdy: 23. 07. 2015, 17:49:11 »
shelve

uetoyo

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #4 kdy: 23. 07. 2015, 18:37:49 »
Ahoj, prostuduj toto: https://docs.python.org/3/library/pickle.html
to je to, co psal @karel (tzv. serializace)


Re:Python 3.4 - jak uchovat nastavení
« Odpověď #5 kdy: 25. 07. 2015, 15:52:46 »
Nemá smysl používat pickle, když shelve je nástavba nad ním vymyšlená přesně pro tyhle případy. Viz http://www.py.cz/Shelve

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #6 kdy: 25. 07. 2015, 15:53:42 »
Případně pokud bys chtěl něco vhodného pro více threadů a komerční nasazení, tak http://www.zodb.org/

mikrom

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #7 kdy: 25. 07. 2015, 22:33:15 »
Ja pouzivam ConfigParser (sucast standard library) a uchovavam nastavenia v INI-suboroch, ktore su normalne citatelne.
Tak napriklad:
config.py
Kód: [Vybrat]
from ConfigParser import ConfigParser

def write_config():
  cfgf = open('c:\work\config.ini','w')
  # config for Class01
  cp.add_section('MyClass01_config')
  cp.set('MyClass01_config','rgb',1)
  cp.set('MyClass01_config','bck',10)
  cp.set('MyClass01_config','txt',45)
  # config for Class02
  cp.add_section('MyClass02_config')
  cp.set('MyClass02_config','foo','spam')
  cp.set('MyClass02_config','bar','eggs')
  cp.write(cfgf)
  cfgf.close()

def print_config():
  cp.read('c:\work\config.ini')
  print "Configuration: "
  print "---------------"
  for section in cp.sections():
    print "[%s]" % section
    for option in cp.options(section):
      print "%s = %s" % (option, cp.get(section, option))

if __name__=="__main__":
  cp = ConfigParser()
  write_config()
  print_config()

Po spusteni
Kód: [Vybrat]
C:\Work>python config.py
vytvori subor config.ini a vypise jeho obsah:
Kód: [Vybrat]
Configuration:
---------------
[MyClass01_config]
rgb = 1
bck = 10
txt = 45
[MyClass02_config]
foo = spam
bar = eggs

Poznamka: Na Python 3.x som sice este nepresiel, ale ConfigParser je v standardnej verzii aj tam - pozri:
https://docs.python.org/3/library/configparser.html

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #8 kdy: 26. 07. 2015, 03:02:20 »
Ja pouzivam ConfigParser (sucast standard library) a uchovavam nastavenia v INI-suboroch, ktore su normalne citatelne.

To není to samé. Shelve / ZODB uchovává celé objekty bez toho, aniž by ses musel starat o serializaci/deserializaci. Pokud to chceš jen používat na pozastavení stavu programu, abys ho při příštím spuštění měl přesně ve stavu, v jakém jsi ho opustil, tak je shelve/ZODB ideální, protože samo serializuje objekty.

mikrom

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #9 kdy: 26. 07. 2015, 08:25:33 »
Je mi to jasne.
  • ak chce OP ukladat zlozite datove struktury:
    • ak to nepotrebuje mat v ludsky-citatelnej forme moze pouzit pickle, shelve, ....
    • ak to chce mat v ludsky-citatelnej forme moze pouzit YAML, JSON
  • ak chce OP ukladat globalne nastavenia programu, tak je idealny ConfigParser a INI-subor v ludsky-citatelnej forme

Mne sa podla dotazu zda, ze OP potrebuje globalne nastavenia programu.

Inkvizitor

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #10 kdy: 26. 07. 2015, 09:24:17 »
Je mi to jasne.
  • ak chce OP ukladat zlozite datove struktury:
    • ak to nepotrebuje mat v ludsky-citatelnej forme moze pouzit pickle, shelve, ....
    • ak to chce mat v ludsky-citatelnej forme moze pouzit YAML, JSON
  • ak chce OP ukladat globalne nastavenia programu, tak je idealny ConfigParser a INI-subor v ludsky-citatelnej forme

Mne sa podla dotazu zda, ze OP potrebuje globalne nastavenia programu.

Podle mě má INI význam tenkrát, pokud chceme mít data nejenom v lidsky čitelné podobě, ale chceme umožnit i editaci. YAML je exot (nic proti), JSON je super v tom, že je přenositelný i mimo Python a dá se validovat  (JSON Schema), dá se v případě potřeby číst i editovat ručně, ale není to až tak moc komfortní, spíše nouzovka. Shelve jsem nikdy nepoužil a nemám k tomu moc motivaci, pickle je pohodlné, pokud se používá jenom z Pythonu. Problém nastává tenkrát, když se změní třeba název třídy, která tam byla původně uložená. Pak se ušetřená práce vrátí zpět jako bumerang.

Obecně - pokud je to jenom trochu možné, použiju JSON. Od 2.6 je v Pythonu podpora standardně, nejsem vázaný na Python (už se mi stalo, že jsem potřeboval zpracovávat mezivýstupy v jiném jazyce - konkrétně ve Scale a stejně jsem je konvertoval z pickle do JSONu). Serializaci složitějších objektů (na což se pickle nebo ZODB samozřejmě docela hodí) se snažím vyhýbat, podle mě to ve většině případů není moc dobrý nápad.

mikrom

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #11 kdy: 26. 07. 2015, 15:41:35 »
...YAML je exot (nic proti)...
YAML som pouzil par krat v Ruby (ktory ma v standardnej kniznici YAML aj JSON).
Myslel som teda, ze Python ma YAML tiez v standardej kniznici, ale neni tomu tak. 

lck

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #12 kdy: 26. 07. 2015, 15:44:22 »
ZODB je overene casom a vyborne zdokumentovane. Ak potrebujete transparentne ulkladanie stavu objektov v pythone je to najlepsia volba. Je tu moznost pouzit napr. aj postgres ako backend pre ZODB :) + ZODB je ACIC databaza teda ma aj transakcie, ale aj vela inych features

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #13 kdy: 26. 07. 2015, 18:03:56 »
Shelve jsem nikdy nepoužil a nemám k tomu moc motivaci, pickle je pohodlné, pokud se používá jenom z Pythonu.

Shelve je jen syntax suggar na pickle.

ZODB je overene casom a vyborne zdokumentovane

Ověřené časem ano, ale ta dokumentace docela pokulhává. Ne že by nebyla, ale je roztříštěná a ve spojení se ZEO clusterem je tam pár věcí, které umí překvapit.

Inkvizitor

Re:Python 3.4 - jak uchovat nastavení
« Odpověď #14 kdy: 26. 07. 2015, 19:26:25 »
...YAML je exot (nic proti)...
YAML som pouzil par krat v Ruby (ktory ma v standardnej kniznici YAML aj JSON).
Myslel som teda, ze Python ma YAML tiez v standardej kniznici, ale neni tomu tak.

O to mi nešlo. Ten formát zná poměrně málo lidí a podle mě je méně intuitivní než třeba INI.