当前位置: 首页 > 面试题库 >

Python:如何从“框架”对象中检索类信息?

吕利
2023-03-14
问题内容

是否可以从框架对象中检索任何类信息?我知道如何获取文件(frame.f_code.co_filename),函数(frame.f_code.co_name)和行号(frame.f_lineno),但也希望能够获取活动对象的类的名称框架的实例(如果不在实例中,则为None)。


问题答案:

我不相信,在框架对象级别上,没有任何方法可以找到已被调用的实际python函数对象。

但是,如果您的代码依赖于通用约定:命名方法的instance参数self,则可以执行以下操作:

def get_class_from_frame(fr):
  import inspect
  args, _, _, value_dict = inspect.getargvalues(fr)
  # we check the first parameter for the frame function is
  # named 'self'
  if len(args) and args[0] == 'self':
    # in that case, 'self' will be referenced in value_dict
    instance = value_dict.get('self', None)
    if instance:
      # return its class
      return getattr(instance, '__class__', None)
  # return None otherwise
  return None

如果您不想使用getargvalues,则可以直接使用frame.f_locals代替value_dictframe.f_code.co_varnames[:frame.f_code.co_argcount]代替args

请记住,这仍然仅依靠约定,因此它不是可移植的,并且容易出错:

  • 如果将非方法函数self用作第一个参数名称,get_class_from_frame则将错误地返回第一个参数的类。
  • 使用描述符时可能会产生误导(它将返回描述符的类,而不是所访问的实际实例的类)。
  • @classmethod并且@staticmethod不会采用self参数,而是通过描述符实现。
  • 当然还有更多

根据您要确切执行的操作,您可能需要花一些时间来更深入地了解所有这些问题的解决方法(可以检查返回的类中是否存在frame函数并共享相同的源,可以检测到描述符调用,对于类方法,等等。)



 类似资料:
  • 我试图使用实体框架核心从我的表中检索一行。这似乎很简单,但我无法让它工作。 我可以通过使用获得列表 _上下文。国家。ToList(); 这给了我表格中国家的完整列表。现在我只需要得到一个与ID匹配的国家。如何做到这一点,因为EF核心中缺少Find()。我们可以选择在哪里吗。谁能帮我理解一下语法吗。 我的国家/地区模型如下所示 公共部分类COUNTRY{public string COUNTRYID

  • 我目前正在进行一个与Firebase集成的Android项目,但是由于Firebase监听器的原因,我正在努力从Firebase实时数据库中检索类对象。 让我详细介绍一下我的项目,以便你能了解它的主要内容。我使用MVVM架构,我有两个活动,其中一个用于身份验证,另一个用于主要用途。 第一个活动包含注册、登录、密码重置片段第二个活动包含4个用于程序主要功能的片段 第一个活动中的片段使用共享的view

  • 问题内容: 所以,我有一个 基于Java的Web项目 ,从3个独立的服务检索到的信息显示,托管在不同的服务器上,我使用 的Apache HTTP客户端 来获取通过在REST API信息 JSON ,使用 GSON库 。我将Json转换为用于显示信息的POJO。 现在,我想在项目中实现搜索功能,因此我将Solr安装在单独的服务器上,我想要的是: 为所有3个服务在solr服务器中索引JSON。 从So

  • 我正在尝试从WordPress对象检索文章标题。 我应该做什么来检索标题?

  • > < li >我们公开了一个Apache camel-cxf webservice。使用camel处理器,我们试图从soapUi客户端获取我们在soap请求中传递的soap头。 < li> 交换对象包含soap消息的正文(不是soap消息头)。在exchange.getIn.getHeader()中,我们只获得传递的HTTP头,而不是SOAP头。 如何在Camel中从交换对象中检索SOAP头?

  • 我似乎找不到在Swift中返回对象类型的函数或方法。 如何在Swift中检索对象的类型或类? 我尝试使用Obj-C类,但显然不起作用。 在python中,有或 在Javascript中有