Python查找调用者的模块信息,使用inspect模块

工作中有一个日志类,每次有人使用它,都需要手动导入一个日志的名称,感觉真的很麻烦。想着每次倒入的模块名本来就是唯一的标识符,而且还容易找出日志的归属。

如果在日志类中写上一个方法,每次谁调用它,就用它模块的名字生成一个日志文件名不是更爽。求救各位大佬。终于在stack_overflow找到答案:

链接:

https://stackoverflow.com/questions/13699283/how-to-get-the-callers-filename-method-name-in-python

 

 def default_file_name(self):
        import inspect
        frame = inspect.stack()[2]
        module = inspect.getmodule(frame[0])  # 根据数据帧取出调用的模块
        filename = module.__file__
        file_name = os.path.splitext(os.path.basename(os.path.abspath(filename)))[0] + ".txt"
        return file_name

  这个是我根据我的logger日志类定义的方法

在Python官方网站,找到一份有意思的资料。

网址:https://docs.python.org/zh-cn/3.7/library/inspect.html#inspect.getmembers

类型

属性

描述

module 模块

__doc__

文档字符串

 

__file__

文件名(内置模块没有文件名)

class -- 类

__doc__

文档字符串

 

__name__

类定义时所使用的名称

 

__qualname__

qualified name -- 限定名称

 

__module__

该类型被定义时所在的模块的名称

method 方法

__doc__

文档字符串

 

__name__

该方法定义时所使用的名称

 

__qualname__

qualified name -- 限定名称

 

__func__

实现该方法的函数对象

 

__self__

该方法被绑定的实例,若没有绑定则为 None

 

__module__

name of module in which this method was defined

function -- 函数

__doc__

文档字符串

 

__name__

用于定义此函数的名称

 

__qualname__

qualified name -- 限定名称

 

__code__

包含已编译函数的代码对象 bytecode

 

__defaults__

tuple of any default values for positional or keyword parameters

 

__kwdefaults__

mapping of any default values for keyword-only parameters

 

__globals__

global namespace in which this function was defined

 

__annotations__

mapping of parameters names to annotations; "return" key is reserved for return annotations.

 

__module__

name of module in which this function was defined

回溯

tb_frame

此级别的框架对象

 

tb_lasti

index of last attempted instruction in bytecode

 

tb_lineno

current line number in Python source code

 

tb_next

next inner traceback object (called by this level)

框架

f_back

next outer frame object (this frame's caller)

 

f_builtins

builtins namespace seen by this frame

 

f_code

code object being executed in this frame

 

f_globals

global namespace seen by this frame

 

f_lasti

index of last attempted instruction in bytecode

 

f_lineno

current line number in Python source code

 

f_locals

local namespace seen by this frame

 

f_trace

tracing function for this frame, or None

code

co_argcount

number of arguments (not including keyword only arguments, * or ** args)

 

co_code

原始编译字节码的字符串

 

co_cellvars

单元变量名称的元组(通过包含作用域引用)

 

co_consts

字节码中使用的常量元组

 

co_filename

创建此代码对象的文件的名称

 

co_firstlineno

number of first line in Python source code

 

co_flags

bitmap of CO_* flags, read more here

 

co_lnotab

编码的行号到字节码索引的映射

 

co_freevars

tuple of names of free variables (referenced via a function's closure)

 

co_kwonlyargcount

number of keyword only arguments (not including ** arg)

 

co_name

定义此代码对象的名称

 

co_names

局部变量名称的元组

 

co_nlocals

局部变量的数量

 

co_stacksize

需要虚拟机堆栈空间

 

co_varnames

参数名和局部变量的元组

generator -- 生成器

__name__

名称

 

__qualname__

qualified name -- 限定名称

 

gi_frame

框架

 

gi_running

生成器在运行吗?

 

gi_code

code

 

gi_yieldfrom

object being iterated by yield from, or None

coroutine -- 协程

__name__

名称

 

__qualname__

qualified name -- 限定名称

 

cr_await

object being awaited on, or None

 

cr_frame

框架

 

cr_running

is the coroutine running?

 

cr_code

code

 

cr_origin

where coroutine was created, or None. See sys.set_coroutine_origin_tracking_depth()

builtin

__doc__

文档字符串

 

__name__

此函数或方法的原始名称

 

__qualname__

qualified name -- 限定名称

 

__self__

instance to which a method is bound, or None

 

这个对一些Python的对象内置的方法作了定义,确实非常不错。今天又学到了,开心😄

posted @ 2020-12-23 14:30  就是想学习  阅读(475)  评论(0编辑  收藏  举报