Python: Comment faire pour récupérer des informations de classe à partir d'un cadre d'objet?
Est-il possible de récupérer toutes les informations de classe à partir d'un cadre d'objet? Je sais comment obtenir le fichier (l'image.f_code.co_filename), la fonction (l'image.f_code.co_name) et le numéro de ligne (frame.f_lineno), mais souhaitez être en mesure d'obtenir également le nom de la classe de l'objet actif instance de l'image (ou rien si ce n'est dans une instance).
Vous devez vous connecter pour publier un commentaire.
Je ne crois pas que, au niveau de l'image au niveau de l'objet, il y a moyen de trouver la réelle fonction python objet qui a été appelé.
Toutefois, si votre code s'appuyer sur la commune de la convention : nom de l'instance paramètre d'une méthode
self
, alors vous pouvez faire ce qui suit :Si vous ne souhaitez pas utiliser
getargvalues
, vous pouvez utiliser directementframe.f_locals
au lieu devalue_dict
etframe.f_code.co_varnames[:frame.f_code.co_argcount]
au lieu deargs
.Garder à l'esprit que ce n'est encore qu'en s'appuyant sur la convention, de sorte qu'il n'est pas portable, et sujettes à l'erreur:
self
comme premier paramètre le nom, puisget_class_from_frame
sera, à tort, de retour de la classe du premier paramètre.@classmethod
et@staticmethod
ne vais pas prendre unself
paramètre et sont mis en œuvre avec des descripteurs.Selon ce exactement que vous voulez faire, vous pouvez prendre le temps de creuser plus profondément et de trouver des solutions de contournement pour toutes ces questions (vous pouvez cocher la fonction d'encadrement existent dans le retour de la classe et de partager la même source, la détection de descripteur d'appels est possible, même pour les méthodes de classe, etc..)
C'est un peu plus court, mais ne la même. Retourne si Aucun nom de la classe n'est pas disponible.
f.f_locals['__class__'].__name__
, qui devrait également couvrir les@classmethod
et@staticmethod
cas.'__class__'
dans f_locals.Je viens de tomber sur ce post que j'ai été confrontée au même problème. Je ne considère pas le " moi " méthode une solution acceptable, cependant, pour toutes les raisons déjà énumérées.
Le code suivant montre une approche différente: étant donné une image de l'objet de la recherche dans le globals pour un objet avec une correspondance de nom de membre et un bloc de code. La recherche n'est guère exhaustive de sorte qu'il est possible que toutes les classes seront découverts, mais ce que les classes sont trouvés devraient être ceux qui nous cherchent parce que nous avons vérifier la correspondance des codes.
Objet du code est de faire précéder le nom d'une fonction avec son nom de la classe, si trouvé:
Notez l'utilisation de
__dict__
au lieu degetattr
pour éviter d'attraper des classes dérivées.Note en outre que la recherche peut être évité si
self = frame.f_locals['self']; obj = self.__class__
donne un match, ou toutobj in self.__class__.__bases__
ou plus profond, donc il y a certainement place pour l'optimisation /hybridation.Si une méthode est une méthode de classe, la classe sera le premier argument. Cette commande affiche le type de la première arg si, pour chaque appel de bloc de pile: