Souper er et Python værktøj for programmører. Det tilbyder en integreret opbevaring bundet sammen med indekser i et katalog. Registreringerne i lageret er generiske. Det er muligt at lagre data på en post, hvis det er persistent pickable i ZODB.
Souper kan bruges bruges i alle python program ved hjælp af ZODB, såsom Pyramid eller Plone.
Brug Souper
Forudsat et Locator
Supper er så op ved at tilpasse souper.interfaces.IStorageLocator til nogle sammenhæng. Souper giver ikke nogen standard locator. Så første skal leveres. Lad os antage sammenhæng er nogle vedvarende dict-lignende instans:
>>> Fra zope.interface import Iværksætter
>>> Fra zope.interface import interface
>>> Fra zope.component import provideAdapter
>>> Fra souper.interfaces importerer IStorageLocator
>>> Fra souper.soup import- SoupData
>>>implementer (IStorageLocator)
... Klasse StorageLocator (objekt):
...
... Def __init __ (self, kontekst):
... Self.context = kontekst
...
... Def opbevaring (self, soup_name):
... Hvis soup_name ikke i self.context:
... Self.context [soup_name] = SoupData ()
... Tilbagevenden self.context [soup_name]
>>> ProvideAdapter (StorageLocator, tilpasser = [interface])
Så vi har locator skabe supper ved navn i farten. Nu er det let at få en suppe ved navn:
>>> Fra souper.soup import get_soup
>>> Suppe = get_soup (»mysoup«, kontekst)
>>> Suppe
Forudsat et katalog Factory
Afhængigt af dine behov kataloget og dens indekser kan se anderledes ud brug-sag for at bruge case. Kataloget Fabrikken er ansvarlig for at skabe et katalog for en suppe. Fabrikken er en navngivet hjælpeprogram gennemførelse souper.interfaces.ICatalogFactory. Navnet på værktøjet har til det samme som suppen har.
Her repoze.catalog er brugt og til at lade indekserne adgang til data på posterne ved tasten NodeAttributeIndexer bruges. For særlige tilfælde kan man skrive sine brugerdefinerede indexere, men standard man er fint det meste af tiden:
>>> Fra souper.interfaces importerer ICatalogFactory
>>> Fra souper.soup import NodeAttributeIndexer
>>> Fra zope.component import provideUtility
>>> Fra repoze.catalog.catalog import kataloget
>>> Fra repoze.catalog.indexes.field import CatalogFieldIndex
>>> Fra repoze.catalog.indexes.text import CatalogTextIndex
>>> Fra repoze.catalog.indexes.keyword import CatalogKeywordIndex
>>>implementer (ICatalogFactory)
... Klasse MySoupCatalogFactory (objekt):
...
... Def __call __ (self, context = Ingen):
... Katalog = Catalog ()
... Userindexer = NodeAttributeIndexer ("bruger")
... Katalog [u'user '] = CatalogFieldIndex (userindexer)
... Textindexer = NodeAttributeIndexer (tekst)
... Katalog [u'text '] = CatalogTextIndex (textindexer)
... keywordindexer = NodeAttributeIndexer ('søgeord')
... Katalog [u'keywords '] = CatalogKeywordIndex (keywordindexer)
... Tilbagevenden katalog
>>> ProvideUtility (MySoupCatalogFactory (), name = "mysoup")
Kataloget fabrik bruges suppe-intern kun men man måtte ønske at kontrollere, om det virker fint:
>>> Catalogfactory = getUtility (ICatalogFactory, navn = 'mysoup ")
>>> Catalogfactory
>>> Katalog = catalogfactory ()
>>> sorteret (catalog.items ())
[(u'keywords «
(U'text ',
(U'user ',
Tilføjelse optegnelser
Som nævnt ovenfor souper.soup.Record er den eneste type data tilsat til suppen. En rekord har attributter, der indeholder data:
>>> Fra souper.soup import get_soup
>>> Fra souper.soup import Record
>>> Suppe = get_soup (»mysoup«, kontekst)
>>> Rekord = Record ()
>>> record.attrs ['user'] = 'bruger1 "
>>> record.attrs ['tekst'] = u'foo bar Baz '
>>> record.attrs ['søgeord'] = [u'1 «, u'2 ', U' & uuml; ']
>>> Record_id = soup.add (optage)
En rekord kan indeholder andre optegnelser. Men indeksere dem man ville behøver en brugerdefineret indekseringen, så usally conatined registreringer er værdifulde for senere visning, ikke for søgning:
>>> Rekord ['subrecord'] = Record ()
>>> rekord ['privatadresse']. attrs ['zip'] = '6020'
>>> rekord ['privatadresse']. attrs ['by'] = 'Innsbruck'
>>> Rekord ['privatadresse']. Attrs ['land'] = 'Østrig'
Få adgang til data
Selv uden enhver forespørgsel en post kan hentes på ID:
>>> Fra souper.soup import get_soup
>>> Suppe = get_soup (»mysoup«, kontekst)
>>> Rekord = soup.get (record_id)
Alle poster kan tilgås ved hjælp anvender beholderen BTree:
>>> soup.data.keys () [0] == record_id
Sandt
Forespørgselsdata
Hvordan til at forespørge en repoze katalog er dokumenteret godt. Sortering virker også den samme. Forespørgsler videregives til supper forespørgsel metode (som bruger derefter repoze katalog). Den returnerer en generator:
>>> Fra repoze.catalog.query import Eq
>>> [R for r i soup.query (Eq ('bruger', 'bruger1 "))]
[
>>> [R for r i soup.query (Eq (»bruger«, »nonexists '))]
[]
For også få størrelsen af resultatet sæt bestå en with_size = True til forespørgslen. Det første element, der returneres af generatoren er størrelsen:
>>> [R for r i soup.query (Eq ('bruger', 'bruger1 "), with_size-sand)]
[1,
For at optimere håndteringen af store resultatsæt kan man ikke for at hente posten, men en generator returnere lette vægt objekter. Records er hentet på opkald:
>>> Doven = [l for li soup.lazy (Eq ('navn', 'navn'))]
>>> Doven
[
>>> Doven [0] ()
Her størrelsen er bestået som første værdi geneartor også hvis with_size = True passeres.
Slet en post
Hvis du vil fjerne en post fra suppen python del bruges ligesom man ville gøre på enhver dict:
>>> Del suppe [record_id]
Reindex
Efter ændret en poster data, den har brug for en Reindex:
>>> record.attrs ['user'] = 'bruger1 "
>>> Soup.reindex (optegnelser = [record])
Sommetider kan man ønsker at genindeksere alle oplysninger. Så Reindex har at blive kaldt uden parametre. Det kan tage et stykke tid:
>>> Soup.reindex ()
Genopbyg katalog
Usally efter en ændring af katalog fabrikken blev gjort - altså nogle indekset blev tilføjet - en genopbygning af kataloget jeg havde brug for. Det erstatter det nuværende katalog med en ny skabt af katalog fabrikken og reindexes alle oplysninger. Det kan tage, mens:
>>> Soup.rebuild ()
Reset (eller fjern) suppen
For at fjerne alle data fra suppe og tomme og genopbygge kataloget opkald klar. OBS: alle data er tabt!
>>> Soup.clear ()
Installation Noter
For at kunne bruge Souper node.ext.zodb er nødvendig. Da denne beta blev frigivet var der ingen frigivelse (vil ske snart). Kontroller pypi hvis det er der, ellers kan du hente node.ext.zodb fra GitHub
Hvad er nyt i denne udgivelse:.
- PEP-8. [Rnix, 2012/10/16]
- Python 2.7 support. [Rnix, 2012/10/16]
- Fix dokumentation.
Krav :
- Python
Kommentarer ikke fundet