Vă mulțumim pentru susținere

Folosind 'in' pentru a potrivi un atribut al obiectelor Python într-un matrice

Nu-mi amintesc dacă visez sau nu, dar îmi amintesc că există o funcție care permitea ceva,

foo in iter_attr(array of python objects, attribute name)

M-am uitat peste docuri, dar acest gen de lucru nu se încadrează în niciunul dintre titlurile evidente

0
adăugat editat

10 răspunsuri

În ceea ce privește scrierea unei caracteristici, am subliniat cum să facem acest lucru cu receptoarele evenimentului aici .

Veți avea nevoie să înlocuiți codul pentru a adăuga receptoare de evenimente cu codul dvs. pentru a adăuga niveluri de permisiune și grupuri. De asemenea, în partea de jos a postului vorbesc despre cum să-l capseze într-o anumită definiție a site-ului.

Nivelele de permisiune sunt numite roluri în api. Veți dori să creați un nou SPRoleDefinition , configurați name și basepermissions, apoi adăugați-l la colecția SPWeb.RoleDefinitions.

Grupurile sunt numite grupuri în api. Veți dori să apelați SPWeb.Groups.Add pentru a crea un grup.

Sper că totul are sens.

1
adăugat

După cum sugerează Steve, SPRoleDefinition este modalitatea de a merge împreună cu SPRoleAssignment . Dacă migrați de la SharePoint 2003 la SharePoint 2007, clasa dvs. SPRole ar funcționa în continuare, dar vă recomand să migrați acea parte a codului la noile clase.

1
adăugat

Ceea ce m-am gândit poate fi realizat folosind înțelegerea listei, dar m-am gândit că a existat o funcție care a făcut acest lucru într-un mod ușor mai curat.

adică "bar" este o listă de obiecte, toate având atributul "id"

Modul mitic funcțional:

foo = 12
foo in iter_attr(bar, 'id')

Modul de înțelegere a listei:

foo = 12
foo in [obj.id for obj in bar]

În retrospectivă, modul de înțelegere a listei este oricum curat.

0
adăugat

Nu, nu visezi. Python are un sistem de înțelegere a listei destul de excelent, care vă permite să manipulați listele destul de elegant și, în funcție de exact ceea ce doriți să realizați, acest lucru se poate face în câteva moduri. În esență, ceea ce faci este să spui "Pentru un articol în listă dacă sunt criterii." Și din care poți doar să repetați rezultatele sau să aruncați rezultatele într-o listă nouă.

Mă duc la un exemplu de la Dive Into Python aici, pentru că este destul de elegant și Ești mai deștept decât mine. Aici obțin o listă de fișiere dintr-un director, apoi filtrează lista pentru toate fișierele care se potrivesc cu criteriile unei expresii regulate.

  files = os.listdir (calea)
    test = re.compile ("test \ .py $", re.IGNORECASE)
    fișiere = [f pentru f în fișiere dacă test.search (f)]
 

Ați putea să faceți acest lucru fără expresii regulate, pentru exemplul dvs., pentru orice lucru în care expresia dvs. la sfârșit se întoarce la adevărat pentru un meci. Există și alte opțiuni, cum ar fi utilizarea funcției filtru (), dar dacă voi alege, aș merge cu asta.

Eric Sipple

0
adăugat

Cred:

#!/bin/python
bar in dict(Foo)

Este ceea ce vă gândiți. Când încercați să vedeți dacă o anumită cheie există într-un dicționar din Python (versiunea python a unui tabel hash), există două modalități de verificare. În primul rând este atașată la dicționar metoda has_key () și al doilea este exemplul dat mai sus. Va reveni o valoare booleană.

Aceasta ar trebui să răspundă la întrebarea dvs.

Și acum un subiect pe care să-l legați de răspunsul list comprehension oferit anterior (pentru o mai mare claritate). Lista comprehensiunilor construi o listă dintr-o bază pentru buclă cu modificatori. Ca un exemplu (pentru a clarifica ușor), o modalitate de a utiliza construcția de limbi în dict într-o înțelegere a listei :

Spuneți că aveți un dicționar bidimensional foo și doriți doar dicționarele de dimensiuni secundare care conțin bar cheie. O modalitate relativ simplă de a face acest lucru ar fi să utilizați o înțelegere listă cu condiționată după cum urmează:

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

Rețineți dacă bara de valori la sfârșitul instrucțiunii **, aceasta este o clauză de modificare care spune că înțelege lista </​​em> pereche cheie-valoare care îndeplinesc condițiile condiționate ** În acest caz baz este un dicționar nou care conține numai dicționarele foo care conțin bara (Sper că nu am ratat ceva în exemplul de cod ... poate fi necesar să aruncați o privire la documentația de comprehensiune a listei găsită în docs.python.org tutoriale și la secnetix.de , ambele site-uri sunt bune referințe dacă aveți întrebări în viitor).

0
adăugat

Dacă aveți de gând să căutați ceva de dimensiune decentă de departe, cel mai bun pariu va fi să utilizați un dicționar sau un set. În caz contrar, trebuie să iterați prin fiecare element al iteratorului până ajungeți la cel pe care îl doriți.

Dacă acest lucru nu este neapărat un cod sensibil la performanță, atunci ar trebui să funcționeze modul de înțelegere a listei. Dar rețineți că este destul de ineficientă deoarece trece peste fiecare element al iteratorului și apoi merge din nou peste el până când găsește ceea ce dorește.

Amintiți-vă, Python are unul dintre algoritmii de hashing mai eficienți în jur. Folosește-l în avantajul tău.

0
adăugat

Funcția pe care o gândiți este probabil operator.attrgettter . De exemplu, pentru a obține o listă care conține valoarea atributului "id" al fiecărui obiect:

import operator
ids = map(operator.attrgetter("id"), bar)

Dacă doriți să verificați dacă lista conține un obiect cu un id == 12, atunci un mod adecvat și eficient (adică nu repetați întreaga listă în mod inutil) modul de a face acest lucru este:

any(obj.id == 12 for obj in bar)

Dacă doriți să utilizați "in" cu attrgetter, păstrând în continuare iterația leneș a listei:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)
0
adăugat

Folosind o înțelegere a listei ar crea o listă temporară, care ar putea mânca toată memoria dacă secvența căutată este mare. Chiar dacă secvența nu este mare, construirea listei înseamnă iterarea în întreaga secvență înainte ca în să-și poată începe căutarea.

Lista temporară poate fi evitată prin utilizarea unei expresii a generatorului:

foo = 12
foo in (obj.id for obj in bar)

Acum, obj.id == 12 lângă începutul bar , căutarea va fi rapidă, chiar dacă bar este infinit de lungă .

După cum a sugerat @Matt, este o idee bună să utilizați hasattr dacă vreunul din obiectele din bar poate să lipsească un atribut id

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
0
adăugat

Încercați să obțineți o listă de obiecte care au un anumit atribut? Dacă da, o înțelegere de listă este modalitatea corectă de a face acest lucru.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
0
adăugat

puteți scrie întotdeauna unul singur:

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

va lucra cu tot ce repetă, fie că este vorba de o listă sau de orice altceva.

Îmi place Python, face lucruri ca acest lucru foarte simplu și nu mai mult de un hassle decât necesar, și în uz chestii ca aceasta este extrem de elegant.

0
adăugat