Bien que la question soit très spécifique, j'apprécierais aussi vraiment les conseils généraux et d'autres approches qui rendraient ma question discutable. Je construis une collection de programmes AI, et beaucoup de fonctions et de classes doivent gérer beaucoup d'états et d'actions différents qui provoquent des transitions entre les états, donc j'ai besoin d'un moyen de représenter les états et les actions. Veuillez noter que je ne construis pas une machine à états simple, mais plutôt un certain nombre de programmes différents (agents) qui prennent tous des états et retournent des actions comme un moyen d'interagir avec un environnement.Comment ajouter par programme des liaisons à la portée de classe actuelle en Python?
Je pourrais utiliser des chaînes, mais c'est compliqué si un algorithme particulier doit associer des informations supplémentaires avec un état ou une action, et comparer les chaînes encore et encore dans des programmes de longue durée est un gaspillage inutile. Les mêmes types de problèmes se posent avec d'autres types de constantes. Donc, mon idée initiale est d'utiliser des classes imbriquées, comme ceci:
class DerivedAgent(Agent):
class StateA(State): pass
class StateB(State): pass
...
def do_something(state):
if state is self.StateA:
...
Cela fonctionne assez bien, mais s'il y a un certain nombre d'états et d'actions, il peut prendre beaucoup d'espace pour les déclarer, et toutes les déclarations de pass sont ennuyantes. Je voudrais pouvoir faire quelque chose comme ...
class DerivedAgent(Agent):
states("StateA", "StateB", "StateC", ...)
Mais je ne vois pas un moyen d'avoir la méthode states
ajouter les types nouvellement créés à la classe DerivedAgent
. Je pense que je pourrais être en mesure de le faire avec le module inspect
, mais cela semble aller trop loin pour un petit confort. Utiliser des types comme ça est une mauvaise idée? Y a-t-il une approche beaucoup plus élégante? Le code en dehors des classes d'agent doit pouvoir accéder aux états et aux actions, et placer des états dans l'espace de nom du module n'est pas une bonne option car un module donné peut contenir plusieurs agents.
C'est exactement le genre de truc que j'espérais pouvoir exister. Merci de l'avoir signalé. – Shawn
content d'avoir pu aider. Vous pourriez vouloir ajouter une vérification pour vous assurer que '__states__' existe dans classdict avant d'essayer de le lire;) J'ai oublié cette partie. ou vous pouvez simplement faire 'pour clsname dans classdict.get ('__ states__', []):' – aaronasterling