On 8 Oct 2022, at 11:50, Weatherby,Gerard <[email protected]> wrote:
Logging does support passing a callable, if indirectly. It only calls __str__ on the object passed if debugging is enabled.
class Defer:
def __init__(self,fn):
self.fn = fn
def __str__(self):
return self.fn()
def some_expensive_function():
return "hello"
logging.basicConfig()
logging.debug(Defer(some_expensive_function))
Oh what a clever hack. Took a few minutes of code reading to see why this works.
You are exploiting the str(msg) that is in class LogRecords getMessage().
```
def getMessage(self):
"""
Return the message for this LogRecord.
Return the message for this LogRecord after merging any user-supplied
arguments with the message.
"""
msg = str(self.msg)
if self.args:
msg = msg % self.args
return msg
```
Barry
From: Python-list <python-list-bounces+gweatherby=[email protected] <mailto:python-list-bounces+gweatherby=[email protected]>> on behalf of Barry <[email protected] <mailto:[email protected]>>
Date: Friday, October 7, 2022 at 1:30 PM
To: MRAB <[email protected] <mailto:[email protected]>>
Cc: [email protected] <mailto:[email protected]> <[email protected] <mailto:[email protected]>>
Subject: Re: Ref-strings in logging messages (was: Performance issue with CPython 3.10 + Cython)
*** Attention: This is an external email. Use caution responding, opening attachments or clicking on links. ***
On 7 Oct 2022, at 18:16, MRAB <[email protected]> wrote:
On 2022-10-07 16:45, Skip Montanaro wrote:
On Fri, Oct 7, 2022 at 9:42 AM Andreas Ames <[email protected]>
wrote:
1. The culprit was me. As lazy as I am, I have used f-strings all over the
place in calls to `logging.logger.debug()` and friends, evaluating all >>> arguments regardless of whether the logger was enabled or not.
I thought there was some discussion about whether and how to efficiently >> admit f-strings to the logging package. I'm guessing that's not gone
anywhere (yet).
Letting you pass in a callable to call might help because that you could use lambda.
Yep, that’s the obvious way to avoid expensive log data generation.
Would need logging module to support that use case.
Barry
-- https://urldefense.com/v3/__https://mail.python.org/mailman/listinfo/python-list__;!!Cn_UX_p3!mrESxAj9YCHsdtNAfkNiY-Zf6U3WTIqaNrgBmbw1ELlQy51ilob43dD0ONsqvg4a94MEdOdwomgyqfyABbvRnA$ <https://urldefense.com/v3/__https:/mail.python.org/mailman/listinfo/
python-list__;!!Cn_UX_p3!mrESxAj9YCHsdtNAfkNiY-Zf6U3WTIqaNrgBmbw1ELlQy51ilob43dD0ONsqvg4a94MEdOdwomgyqfyABbvRnA$>
-- https://urldefense.com/v3/__https://mail.python.org/mailman/listinfo/python-list__;!!Cn_UX_p3!mrESxAj9YCHsdtNAfkNiY-Zf6U3WTIqaNrgBmbw1ELlQy51ilob43dD0ONsqvg4a94MEdOdwomgyqfyABbvRnA$ <https://urldefense.com/v3/__https:/mail.python.org/mailman/listinfo/
python-list__;!!Cn_UX_p3!mrESxAj9YCHsdtNAfkNiY-Zf6U3WTIqaNrgBmbw1ELlQy51ilob43dD0ONsqvg4a94MEdOdwomgyqfyABbvRnA$>
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)