我正在尝试学习应用程序的工作原理.为此,我将调试命令作为每个函数体的第一行插入,目的是记录函数的名称以及我向日志输出发送消息的行号(在代码中).最后,由于此应用程序包含许多文件,因此我想创建一个日志文件,以便我可以更好地理解应用程序的控制流.
这就是我所知道的:
为了获取函数名称,我可以使用function_name.__name__但我不想使用function_name(这样我就可以Log.info("Message")在所有函数的主体中快速复制和粘贴泛型).我知道这可以在C中使用__func__宏完成,但我不确定python.
为了获取文件名和行号,我已经看到(并且我相信)我的应用程序正在使用Python locals()函数,但是在我不完全了解的语法中,例如:options = "LOG.debug('%(flag)s : %(flag_get)s' % locals())我尝试使用类似LOG.info("My message %s" % locals())产生的东西{'self': <__main__.Class_name object at 0x22f8cd0>}.有什么意见吗?
我知道如何使用日志记录并向其添加处理程序以记录到文件,但我不确定是否可以使用单个文件以正确的项目函数调用顺序记录所有日志消息.
我非常感谢任何帮助.
谢谢!
每次调用特定类的方法时,我都需要执行某些操作(例如记录方法名称).如何在Python中以通用方式实现这一目标?
运行下面的代码打印出两条消息:
[INFO] 2017-07-14 21:42:07, printed by func A
[INFO] 2017-07-14 21:42:07, printed by func B
Run Code Online (Sandbox Code Playgroud)
我们知道logging模块的formatter方法可用于自定义消息的格式.我们可以将它配置为使用当前时间或详细级别或日期等启动日志消息.我想知道是否有一种方法可以包含创建日志的函数名称.因此,每次使用该log.info()方法时,都会有一个函数名称,甚至可能还有一个代码行号.
import logging
formatter = logging.Formatter("[%(levelname)s] %(asctime)s, %(message)s", "%Y-%m-%d %H:%M:%S")
handler = logging.StreamHandler()
handler.setFormatter(formatter)
log = logging.getLogger(__name__)
log.addHandler(handler)
log.setLevel(logging.DEBUG)
def funct_A():
log.info('printed by func A')
def funct_B():
log.info('printed by func B')
funct_A()
funct_B()
Run Code Online (Sandbox Code Playgroud) 我已经阅读了关于'self'解释的SO帖子,我已经阅读了关于类的Python文档.我想我理解selfPython类中的用法及其中的约定.
但是,对于Python及其成语相对较新,我无法理解为什么有些用self在过程类型函数定义中.例如,在关于整数类型的Python文档中,示例函数是:
def bit_length(self):
s = bin(self) # binary representation: bin(-37) --> '-0b100101'
s = s.lstrip('-0b') # remove leading zeros and minus sign
return len(s) # len('100101') --> 6
Run Code Online (Sandbox Code Playgroud)
更换self用num的相同的功能结果; 即:
def bit_length(num):
s = bin(num) # binary representation: bin(-37) --> '-0b100101'
s = s.lstrip('-0b') # remove leading zeros and minus sign
return len(s) # len('100101') --> 6
Run Code Online (Sandbox Code Playgroud)
没有像__init__我这样的成语,这里为什么self …
有没有办法在函数内知道函数是自己调用还是赋值给=的变量?
我想做这样的事情:
def func():
if 'assigned with equal':
return 5
else:
print 'not assigned'
Run Code Online (Sandbox Code Playgroud)
那将产生这些产出:
func()
-> 'not assigned'
a = func()
a
-> 5
Run Code Online (Sandbox Code Playgroud) 跟进这个答案:/sf/answers/1215659301/
在我的 macbook pro 2015(2.8 GHz Intel Core i7)和 python 3.6 上,我得到:
python3 -m timeit -s 'import inspect' 'inspect.currentframe().f_code.co_name'
>>> 1000000 loops, best of 3: 0.428 usec per loop
python3 -m timeit -s 'import sys' 'sys._getframe().f_code.co_name'
>>> 10000000 loops, best of 3: 0.114 usec per loop
Run Code Online (Sandbox Code Playgroud)
使用sys._getframe() 比inspect.currentframe() 快4 倍。
怎么会?
我有一个Person包含一个name(str)和age(int)列的表的数据库。所以,我为我的sqlite3.connection
def adult(age):
return age > 18
Run Code Online (Sandbox Code Playgroud)
并使用以下代码,它工作正常
connection = sqlite3.connect(r'C:\Dev\Garbage\database.db')
with connection:
connection.create_function('adult', 1, adult)
cursor = connection.cursor()
persons = cursor.execute('select "p"."name", "p"."age" from "Person" "p" where adult("p"."age")').fetchall()
for person in persons:
print(person)
Run Code Online (Sandbox Code Playgroud)
但如果我adult像这样改变
def adult(age):
return 1 / 0
Run Code Online (Sandbox Code Playgroud)
我会得到sqlite3.OperationalError: user-defined function raised exception。在我的项目中,它可能包含大量函数,我想知道 -有没有办法知道哪个函数引发了异常?或者得到ZeroDivisionError: division by zero而不是这个。
我有很多功能,例如:
def DBworker_thatdoes_job7():
print "DBworker_thatdoes_job7 starting..."
... the actual code here ...
print "DBworker_thatdoes_job7 finished."
Run Code Online (Sandbox Code Playgroud)
如何在不硬编码函数名称的情况下执行此操作?这是我想要实现的目标:
def DBworker_thatdoes_job7():
print thisfunction.name + " starting..."
...
def DBworker_thatdoes_cleaning18():
print thisfunction.name + " starting..."
...
Run Code Online (Sandbox Code Playgroud)
注意:我已经看过如何在 Python 中将函数名作为字符串获取?但我真的没有看到在这里做这件事的好方法。此外,这个问题接近于在该函数内确定函数名称(不使用回溯),但这里适用于启动和结束时函数名日志记录的特定用例,因此不完全是重复的。