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 :
Réponses
Trop de publicités?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.
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.
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.