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__ |
该方法被绑定的实例,若没有绑定则为 |
|
__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; |
|
__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 |
|
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_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 |
|
coroutine -- 协程 |
__name__ |
名称 |
__qualname__ |
qualified name -- 限定名称 |
|
cr_await |
object being awaited on, or |
|
cr_frame |
框架 |
|
cr_running |
is the coroutine running? |
|
cr_code |
code |
|
cr_origin |
where coroutine was created, or |
|
builtin |
__doc__ |
文档字符串 |
__name__ |
此函数或方法的原始名称 |
|
__qualname__ |
qualified name -- 限定名称 |
|
__self__ |
instance to which a method is bound, or |
这个对一些Python的对象内置的方法作了定义,确实非常不错。今天又学到了,开心😄