661 votes

C-comme des structures en Python

Y a-t-il un moyen de définir facilement une structure en forme de C en Python ? Je suis fatigué d’écrire des choses comme :

384voto

gz. Points 1979

Pour un "ensemble" de la solution, voir Raymond Hettinger est nommé tuple de la recette. C'est gentil pour votre exemple de base, mais couvre également un tas de bord des cas, vous aurez peut-être plus tard. Votre fragment ci-dessus devrait être écrite comme:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")

Le nouveau type peut être utilisée comme ceci:

m = MyStruct("foo", "bar", "baz")

Ou vous pouvez utiliser les arguments nommés:

m = MyStruct(field1 = "foo", field2 = "bar", field3 = "baz")

Nommé n-uplet est une partie des collections du module, ce qui a été ajouté à la bibliothèque standard de Python 2.6.

105voto

dF. Points 29787

Vous pouvez utiliser un tuple pour beaucoup de choses lorsque vous utilisez une struct en C (quelque chose comme coordonnées x,y ou RVB en couleurs par exemple).

Pour tout le reste, vous pouvez utiliser le dictionnaire, ou une classe utilitaire comme cette une:

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)

Je pense que la version "définitive" de la discussion est ici, dans la version publiée de l'Python Cookbook.

88voto

Jose M Balaguer Points 299

Peut-être vous cherchez Structs sans constructeurs :

72voto

Mark Biek Points 41769

Que diriez-vous d’un dictionnaire ?

Quelque chose comme ceci :

Puis, vous pouvez utiliser ceci pour manipuler les valeurs :

Et les valeurs ne doivent être des chaînes. Ils peuvent être à peu près n’importe quel autre objet.

28voto

Vicent Marti Points 2942

dF: c'est assez cool... je n'ai pas savoir que je pouvais accéder au champs une classe à l'aide dict.

Marque: les situations que je souhaite que j'avais ce sont précisément quand je veux un tuple mais rien d'aussi "lourd" comme un de dictionnaire.

Vous pouvez accéder aux champs d'une classe à l'aide d'un dictionnaire, parce que les champs d'une classe, de ses méthodes et de toutes ses propriétés sont enregistrées dans la mémoire interne à l'aide dicts (au moins en Cython).

...Ce qui nous amène à votre deuxième commentaire. Croire que Python dicts sont "lourds" est une manière extrêmement non-pythonistic concept. Et la lecture de ces commentaires tue mon Python Zen. Ce n'est pas bon.

Voyez-vous, lorsque vous déclarez une classe, vous créez en fait une assez complexe wrapper autour d'un dictionnaire si, si quoi que ce soit, vous ajoutez plus de ressources que par la simple utilisation d'un dictionnaire. Une surcharge qui, en passant, est dénuée de sens en tout cas. Si vous travaillez sur la performance des applications critiques, utilisez C ou quelque chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X