gue*_*tli 2 python logging structlog
我阅读了structlog的文档:Configuration
目标是将每个文件的日志记录样板减少到:
Run Code Online (Sandbox Code Playgroud)from structlog import get_logger logger = get_logger()
有没有办法将此减少到一个导入线(没有;)?
无法在import语句中执行调用.
import_stmt: import_name | import_from
import_name: 'import' dotted_as_names
import_from: ('from' (('.' | '...')* dotted_name | ('.' | '...')+)
'import' ('*' | '(' import_as_names ')' | import_as_names))
import_as_name: NAME ['as' NAME]
dotted_as_name: dotted_name ['as' NAME]
import_as_names: import_as_name (',' import_as_name)* [',']
dotted_as_names: dotted_as_name (',' dotted_as_name)*
dotted_name: NAME ('.' NAME)*
Run Code Online (Sandbox Code Playgroud)
语法没有为可以进行调用的import语句指定表单.特别是,接受括号的唯一形式是'(' import_as_names ')',其中import_as_names定义为NAME ['as' NAME],而对函数的调用需要使用parameters.
我建议您仔细阅读语法规范,以便深入理解.
但是,可以在一行中完成您的目标.这是三个解决方案.
第一个是你在问题中提到的.第二个是由Chris_Rands在评论中引起的(后来在答案中).第三个基本上是作弊,看起来像主文件中的单行.
from structlog import get_logger; logger = get_logger()
Run Code Online (Sandbox Code Playgroud)
__import__函数logger = __import__('structlog').get_logger()
Run Code Online (Sandbox Code Playgroud)
请注意,这不是 import语句,因为它与上述摘要的任何指定形式都不匹配.
interface.py
from structlog import get_logger
logger = get_logger()
Run Code Online (Sandbox Code Playgroud)
main.py
from interface import logger
Run Code Online (Sandbox Code Playgroud)
这更像是作弊,但从主文件的角度来看,导入是一行.
如果您选择此方法,我强烈建议您为该方法创建一个新文件interface.py.您可能想logger = get_logger()在最后添加一个structlog.py,但是您可以打破模块,最明显的情况是某些变量logger已经存在.
这就是说,让您的代码分为两行,绝对没问题.我理解人们可以尽可能多地制作单行,因为Python非常擅长(我不会链接关于lambda表达式的帖子,但你可以很容易地找到一些例子).
但是,get_logger实际上被引用为structlog.get_logger(*args, **kwargs),这意味着它可以接收参数来初始化它返回的记录器.使用它们的方式记录在get_logger源代码中.
现在,假设您必须执行一些处理来生成这些参数.您的代码将类似于:
from structlog import get_logger
args = initialize_args()
kwargs = initialize_kwargs()
logger = get_logger(args, kwargs)
Run Code Online (Sandbox Code Playgroud)
好吧,你仍然可以把它变成一个单行......但它会变得不必要地长,而且几乎不可读.
正如我在评论中提到的,要获得一个班轮,您可以使用__import__():
logger = __import__('structlog').get_logger()
但是,如文档中所述,__import__()通常不建议使用:
不鼓励直接使用__import __()以支持importlib.import_module().
importlib.import_module()需要进口本身,通过添加另一行import importlib,除非你导入importlib通过__import__(),这似乎是一个坏主意.
无论如何,您不需要__import__()或importlib.import_module()在您的情况下,通常在从将模块名称存储为字符串的变量动态导入时使用.我认为你应该保留你所拥有的两条线,我认为这条线简洁易读.
| 归档时间: |
|
| 查看次数: |
550 次 |
| 最近记录: |