Utiliser 'in' pour faire correspondre un attribut d'objets Python dans un tableau

Je ne me souviens pas si je rêvais ou non, mais je crois me rappeler qu'il y avait une fonction qui permettait quelque chose comme,

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

J'ai regardé les docs mais ce genre de chose ne tombe pas sous les en-têtes listés

0
ajouté édité
Vues: 2

10 Réponses

En ce qui concerne l'écriture d'une fonctionnalité, j'ai expliqué comment faire avec les récepteurs d'événements ici .

Vous aurez juste besoin de remplacer le code pour ajouter des récepteurs d'événements avec votre code pour ajouter des niveaux d'autorisation et des groupes. Aussi, au bas du message, je parle de la façon de l'agrafer à une définition de site spécifique.

Les niveaux d'autorisation sont appelés rôles dans l'API. Vous voudrez créer un SPRoleDefinition , configurer le name et basepermissions, puis ajoutez-le à la collection SPWeb.RoleDefinitions.

Les groupes sont appelés groupes dans l'API. Vous voudrez appeler SPWeb.Groups.Add pour créer un groupe.

J'espère que tout cela a du sens.

1
ajouté

Comme le suggère Steve, SPRoleDefinition est le moyen d'aller avec SPRoleAssignment . Si vous migrez de SharePoint 2003 vers SharePoint 2007, votre classe SPRole fonctionnera toujours mais je suggère de migrer cette partie du code vers les nouvelles classes.

1
ajouté

Ce à quoi je pensais peut être réalisé en utilisant des compréhensions de liste, mais je pensais qu'il y avait une fonction qui a fait cela d'une manière légèrement plus nette.

c'est-à-dire 'bar' est une liste d'objets, tous ayant l'attribut 'id'

La manière fonctionnelle mythique:

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

La façon de comprendre la liste:

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

Rétrospectivement, la méthode de compréhension de la liste est plutôt jolie.

0
ajouté

Non, tu ne rêvais pas. Python a un très bon système de compréhension de liste qui vous permet de manipuler les listes de manière assez élégante, et en fonction de ce que vous voulez accomplir, cela peut être fait de plusieurs façons. En substance, ce que vous faites est de dire "Pour l'élément dans la liste if criteria.matches", et à partir de cela, vous pouvez simplement parcourir les résultats ou vider les résultats dans une nouvelle liste.

Je vais donner un exemple de Plongez dans Python ici, parce que c'est assez élégant et ils suis plus intelligent que moi. Ici, ils obtiennent une liste de fichiers dans un répertoire, puis filtrent la liste pour tous les fichiers qui correspondent à un critère d'expression régulière.

  fichiers = os.listdir (chemin)
    test = re.compile ("test \ .py $", re.IGNORECASE)
    files = [f pour f dans les fichiers si test.search (f)]
 

Vous pouvez le faire sans expressions régulières, pour votre exemple, pour tout ce que votre expression à la fin renvoie vrai pour une correspondance. Il y a d'autres options comme l'utilisation de la fonction filter (), mais si j'allais choisir, j'irais avec ça.

Eric Sipple

0
ajouté

Je pense:

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

Est ce que vous pensez. Lorsque vous essayez de voir si une certaine clé existe dans un dictionnaire en python (la version python d'une table de hachage) il y a deux façons de vérifier. La première est la méthode has_key() attachée au dictionnaire et la seconde est l'exemple donné ci-dessus. Il retournera une valeur booléenne.

Cela devrait répondre à votre question.

Et maintenant un peu hors sujet de lier ceci à la réponse list comprehension donnée précédemment (pour un peu plus de clarté). List Comprehensions construit une liste à partir d'une boucle de base avec des modificateurs. A titre d'exemple (pour clarifier légèrement), un moyen d'utiliser la construction du langage dans dict dans une compréhension de liste :

Disons que vous avez un dictionnaire bidimensionnel foo et que vous ne voulez que les dictionnaires de deuxième dimension qui contiennent la clé bar . Une façon relativement simple de le faire serait d'utiliser une compréhension de liste avec un conditionnel comme suit:

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

Notez le si valeur de barre à la fin de l'instruction **, il s'agit d'une clause de modification qui indique à la liste compréhension de ne conserver que ** Dans ce cas, baz est un nouveau dictionnaire qui ne contient que les dictionnaires de foo contenant une barre (J'espère que je n'ai pas manqué quoi que ce soit dans cet exemple de code ... vous devrez peut-être jeter un coup d'œil à la documentation de compréhension de liste trouvée dans didacticiels docs.python.org et secnetix.de , les deux sites sont de bonnes références si vous avez des questions dans le futur.).

0
ajouté

Si vous envisagez de chercher quelque chose de taille décente, votre meilleur pari sera d'utiliser un dictionnaire ou un ensemble. Sinon, vous devez essentiellement parcourir tous les éléments de l'itérateur jusqu'à ce que vous arriviez à celui que vous voulez.

Si ce n'est pas forcément un code sensible à la performance, la méthode de compréhension de la liste devrait fonctionner. Mais notez qu'il est assez inefficace car il va au-dessus de chaque élément de l'itérateur et revient ensuite dessus jusqu'à ce qu'il trouve ce qu'il veut.

Rappelez-vous, python a l'un des algorithmes de hachage les plus efficaces autour. Utilisez-le à votre avantage.

0
ajouté

La fonction à laquelle vous pensez est probablement operator.attrgettter . Par exemple, pour obtenir une liste contenant la valeur de l'attribut "id" de chaque objet:

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

Si vous voulez vérifier si la liste contient un objet avec un identifiant == 12, alors une méthode soignée et efficace (c'est-à-dire ne pas itérer inutilement toute la liste) est la suivante:

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

Si vous voulez utiliser 'in' avec attrgetter, tout en conservant l'itération paresseuse de la liste:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)
0
ajouté

Utiliser une liste de compréhension permettrait de construire une liste temporaire, qui pourrait manger toute votre mémoire si la séquence recherchée est grande. Même si la séquence n'est pas grande, construire la liste signifie itérer sur toute la séquence avant que dans puisse commencer sa recherche.

La liste temporaire peut être évitée en utilisant une expression de générateur:

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

Maintenant, tant que obj.id == 12 près du début de bar , la recherche sera rapide, même si bar est infiniment long .

Comme l'a suggéré @Matt, c'est une bonne idée d'utiliser hasattr si l'un des objets dans bar peut manquer un attribut id :

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
0
ajouté

Cherchez-vous à obtenir une liste d'objets qui ont un certain attribut? Si c'est le cas, une compréhension de la liste est la bonne façon de procéder.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
0
ajouté

tu pourrais toujours en écrire un toi-même:

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

fonctionnera avec tout ce qui itère, que ce soit un tuple, une liste, ou autre.

J'adore les pythons, ça rend les trucs comme ça très simples et pas plus compliqués que nécessaire, et des trucs comme ça sont extrêmement élégants.

0
ajouté