在Python中,如何从方法中打印当前调用堆栈(用于调试目的).
如果你有两个功能,如:
def A
def B
Run Code Online (Sandbox Code Playgroud)
和A打电话给B,你能得到谁在B里面叫B,比如:
def A () :
B ()
def B () :
this.caller.name
Run Code Online (Sandbox Code Playgroud) 如何获得调用当前函数的函数的名称和行?我希望有一个像这样的基本调试函数(使用npmlog定义log.debug):
function debug() {
var callee, line;
/* MAGIC */
log.debug(callee + ":" + line, arguments)
}
Run Code Online (Sandbox Code Playgroud)
当从另一个函数调用时,它将是这样的:
function hello() {
debug("world!")
}
// outputs something like:
// "hello:2 'world!'"
Run Code Online (Sandbox Code Playgroud)
为清楚起见,我想要的基本上类似于Python:
import inspect
def caller():
return inspect.stack()[2][3]
// line no from getframeinfo().lineno
Run Code Online (Sandbox Code Playgroud)
是否有一个节点等效于完成此操作?
这是否有更短的形式?
if __name__ == '__main__':
Run Code Online (Sandbox Code Playgroud)
写作非常繁琐,而且在我看来也不是很好看:)
我只是在分析我的Python程序,看看为什么它看起来很慢.我发现它的大部分运行时间花费在inspect.stack()方法上(用于输出带模块和行号的调试消息),每次调用0.005秒.这似乎相当高; 是inspect.stack真的这种缓慢的,或可能的东西是错误与我的计划?
我有一些我需要添加日志记录的Python代码.
我总是喜欢漂亮的大C宏看起来语句,如"DEBUG()","ERROR()"等用于日志记录.我觉得当跟踪点在视觉上与实际代码区分开来时,它使代码更容易阅读(没有对象).
我还希望能够在每个模块级别设置日志记录级别.
我怎样才能创建一个名为"log"的模块,它能够做到这一点(同时使用Python标准库记录模块)?
例如:
文件:main.py
# This imports LOG_MODULE_NAME, DEBUG, WARN, etc
from log import *
import my_module
LOG_MODULE_NAME("main")
log.set_level("main", log.LVL_DEBUG)
log.set_level("my_module", log.LVL_WARN)
if __name__ == "__main__":
foo = my_module.myFunc(2)
DEBUG("Exiting main.py")
Run Code Online (Sandbox Code Playgroud)
文件:my_module.py
from log import *
LOG_MODULE_NAME("my_module")
def myFunc(x):
DEBUG("Entering function")
if x != 1:
WARN("I thought it would be 1")
DEBUG("Exiting function")
return x+1
Run Code Online (Sandbox Code Playgroud)
我希望输出看起来像:
[WARN:my_module - my_module.py:9] I thought it would be 1
[DEBUG:main - main.py:11] Exiting main.py
Run Code Online (Sandbox Code Playgroud) 我遇到了一个难题.我想我应该知道如何解决这个问题 - 我在Python方面知识渊博且经验丰富 - 但我无法弄明白.似乎我正在努力解决的问题应该通过一种设计模式来解决,这种设计模式是工厂主题的变体,但我不记得了.(在这篇文章的最后,我提出了一个技术解决方案,但它似乎是一个难以置信的解决方案.)我希望你发现这个讨论本身很有趣,但我期待听到一些解决我问题的建议.
给定类A,B,C和D,我想将B实例的创建限制为A的方法,将C实例的方法限制为B的方法,将D实例限制为C的方法 - 换句话说,A实例是B的工厂实例,B实例化C实例的工厂,C实例代表D实例的工厂.(我还希望D的每个实例存储C的哪个实例创建它,C的每个实例存储B创建它的哪个实例,以及B的每个实例存储A的哪个实例创建它,但这很容易通过让每个实例__init__在层次结构中创建下一个类的实例时将其自身作为参数.)
这些是应用程序操作的模型层类.应用程序操作B,C或D的实例没有问题,它只是不应该直接创建它们 - 它应该能够直接创建A的实例(而A甚至可能是单例).可以在创建下一个实例的一个类的方法中实现各种类型的验证,管理,跟踪,审计等.
一个示例可能是可以创建可以创建可以创建文件的目录的文件系统的操作系统,但应用程序代码必须遵循该链.例如,即使它掌握在Directory上,它也不应该能够创建一个给出File.__init__Directory实例的File,即使这是当要求创建File时Directory的实例.
我正在寻找一个设计解决方案支持一些实现,而不是用户证明的东西 - 我理解后者的徒劳无益.
到目前为止,我唯一想到的是:
通过从模块__all__列表中省略类来模块级"隐藏" 是不够的,因为它只影响import *构造 - 另一个模块仍然可以通过import module引用来到达类module.class.
(这一点都让人联想起C++问题,这些问题需要两个类成为朋友,因为它们参与双向关系:每个类的实例必须能够引用管理另一个类的另一个类的方法.关系.)
可能最符合Python语义和语用的解决方案是在C中定义D,在B中定义C,在A中定义B.这似乎是将多个模块的代码编码到一个非常大的类中的一种非常难看的方式.(并想象一下,如果连锁经历了几个级别.)这是嵌套类的更常见用法的扩展,也许是这种技术上合理的方式,但我从未见过这种俄式玩偶类结构.
想法?
我知道如何获取调用方法名称(从这里:如何在被调用的方法中获取调用方的方法名称?)
import sys
print sys._getframe().f_back.f_code.co_name
Run Code Online (Sandbox Code Playgroud)
我想得到的是这个方法所属的类名(假设它在类中).因此,如果:
def get_some_info():
print('Class name of caller:', XXX)
class Base:
def my_method(self):
get_some_info()
class A(Base):
pass
class B(Base):
pass
a = A()
b = B()
a.my_method()
b.my_method()
Run Code Online (Sandbox Code Playgroud)
应该返回:
... A
... B
Run Code Online (Sandbox Code Playgroud)
我该怎么办xxx?
我试过(使用信息_getframe)做类似的事情:
sys._getframe().f_back.f_code.__self__
Run Code Online (Sandbox Code Playgroud)
但它不起作用
更新:
我不能将类名传递给被调用的函数(否则这很容易,但感谢所有提出此解决方案的人!)
如果这个问题太基本/显而易见,我深表歉意,但在此处和数据模型文档搜索后我找不到合理的答案。
我的问题很简单,Python 3 中的调用者到底是什么?有严格的定义吗?
例如,我知道调用另一个函数的函数称为调用者。所以:
def f1():
pass
def f2():
f1()
Run Code Online (Sandbox Code Playgroud)
f2 是 f1 的调用者。但是赋值语句呢?
x = f2()
Run Code Online (Sandbox Code Playgroud)
xa 是 f2 的调用者吗?它也是f1的调用者吗?显然,函数定义末尾的 return 语句向调用者返回一个值,因此我假设在这种情况下 x 既是 f2 又是 f1 的调用者,但是我只想检查是否没有更深层次的调用者/调用者的技术含义是什么?
我发现这个问题我不明白Python中的“返回”以及调用者是什么?,但我无法得到太多理解。
在 python 中,如果我想创建一个对象,该对象在传递给特定函数时执行某些操作,我该怎么做?例如:
import logging
class TestObject:
def __logging__(self):
# It would check the calling function here and return something
# if it was a log function call from a logging class log function call
return 'Some text'
Run Code Online (Sandbox Code Playgroud) 我希望能够监视变量并在更改类的实例时调用类中的函数。
class Example:
def __init__(self, content):
self.content = content
example1 = Example('testing')
example1.content = 'testing123'
Run Code Online (Sandbox Code Playgroud)
我希望能够检查是否example1.content已更改/更新,如果已更改,请运行一些代码。
我有课
class A:
def __init__(self):
print(i was used by :)
# if i call this class from the function below,
def my_func():
a = A()
# I need class A to print that "i was used in: my_func() "
Run Code Online (Sandbox Code Playgroud)
有什么解决办法吗?
python ×11
class ×2
debugging ×2
python-3.x ×2
inspect ×1
javascript ×1
logging ×1
node.js ×1
python-2.7 ×1
stack-trace ×1