相关疑难解决方法(0)

Python使用单个文件记录(功能名称,文件名,行号)

我正在尝试学习应用程序的工作原理.为此,我将调试命令作为每个函数体的第一行插入,目的是记录函数的名称以及我向日志输出发送消息的行号(在代码中).最后,由于此应用程序包含许多文件,因此我想创建一个日志文件,以便我可以更好地理解应用程序的控制流.

这就是我所知道的:

  1. 为了获取函数名称,我可以使用function_name.__name__但我不想使用function_name(这样我就可以Log.info("Message")在所有函数的主体中快速复制和粘贴泛型).我知道这可以在C中使用__func__宏完成,但我不确定python.

  2. 为了获取文件名和行号,我已经看到(并且我相信)我的应用程序正在使用Python locals()函数,但是在我不完全了解的语法中,例如:options = "LOG.debug('%(flag)s : %(flag_get)s' % locals())我尝试使用类似LOG.info("My message %s" % locals())产生的东西{'self': <__main__.Class_name object at 0x22f8cd0>}.有什么意见吗?

  3. 我知道如何使用日志记录并向其添加处理程序以记录到文件,但我不确定是否可以使用单个文件以正确的项目函数调用顺序记录所有日志消息.

我非常感谢任何帮助.

谢谢!

python logging

96
推荐指数
4
解决办法
7万
查看次数

Python - 每当调用类的方法时,打印方法名称

每次调用特定类的方法时,我都需要执行某些操作(例如记录方法名称).如何在Python中以通用方式实现这一目标?

python methods class

8
推荐指数
2
解决办法
2065
查看次数

如何将函数名称包含在日志记录中

运行下面的代码打印出两条消息:

[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)

python logging

7
推荐指数
1
解决办法
2250
查看次数

Python'自我'的功能

我已经阅读关于'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)

更换selfnum的相同的功能结果; 即:

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 …

python idioms self

5
推荐指数
1
解决办法
3730
查看次数

一个函数可以知道它是如何被调用的吗?

有没有办法在函数内知道函数是自己调用还是赋值给=的变量?

我想做这样的事情:

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)

python

5
推荐指数
0
解决办法
185
查看次数

为什么inspect.currentframe比sys.currentframe慢?_getframe?

跟进这个答案:/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 倍。

怎么会?

python

5
推荐指数
1
解决办法
1625
查看次数

如何从 sqlite create_function 获取错误类型?

我有一个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而不是这个。

python sqlite

4
推荐指数
1
解决办法
1630
查看次数

在函数本身中打印函数名称

我有很多功能,例如:

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 中将函数名作为字符串获取?但我真的没有看到在这里做这件事的好方法。此外,这个问题接近于在该函数内确定函数名称(不使用回溯),但这里适用于启动和结束时函数名日志记录的特定用例,因此不完全是重复的。

python function

2
推荐指数
1
解决办法
333
查看次数

标签 统计

python ×8

logging ×2

class ×1

function ×1

idioms ×1

methods ×1

self ×1

sqlite ×1