在数据类上观看ArjanCodes视频后,
我一直在尝试从json配置文件向python数据类添加变量,以格式化Jupyterlab中打印函数printT的字体样式。
我使用ANSI转义来格式化,如果我将变量导入数据类,它就不再起作用了。
# config.json
{
"lb" : "\n",
"solid_line" : "'___'*20 + config.lb",
"dotted_line" : "'---'*20 + config.lb",
"BOLD" : "\\033[1m",
"END" : "\\033[0m"
}
# config.py
from dataclasses import dataclass
import json
@dataclass
class PrintConfig:
lb : str
solid_line : str
dotted_line : str
BOLD : str
END : str
def read_config(config_file : str) -> PrintConfig:
with open(config_file, 'r') as file:
data = json.load(file)
return(PrintConfig(**data))
# helper.py
from config import read_config
config = read_config('config.json')
def printT(title,linebreak= True,addLine = True, lineType = config.solid_line,toDisplay = None):
'''
Prints a line break, the input text and a solid line.
Inputs:
title = as string
linebreak = True(default) or False; Adds a line break before printing the title
addLine = True(default) or False; Adds a line after printing the title
lineType = solid_line(default) or dotted_line; Defines line type
toDisplay = displays input, doesnt work with df.info(),because info executes during input
'''
if linebreak:
print(config.lb)
print(config.BOLD + title + config.END)
if addLine:
print(lineType)
if toDisplay is not None:
display(toDisplay)
# test.ipynb
from helper import printT
printT('Hello World')
输出
\033[1mHello World\033[0m
'___'*20 + config.lb
期望结果
你好世界
如果我使用eval if addLine: print(eval(lineType))
,它也能工作,但我想更深入地了解这里的机制。有没有一种方法可以让它在没有eval的情况下工作?
这部分"solid_line" : "'___'*20 + config.lb"
也感觉不对。
Markdown as alternative to ANSI
2条答案
按热度按时间tvz2xvvm1#
这个字符串由一个实际的反斜杠和数字
033
等组成。要在ansi终端上打开粗体,你需要一个转义字符(八进制33),后面跟一个
[1m
,在Python中,你可以用一个反斜杠来编写这些转义代码:"\033[1m"
。在json文件中,您必须提供转义字符\u001b
的unicode代码点。如果其余部分按顺序排列,您将看到粗体。至于
eval
部分,你有一个包含你需要计算的表达式的字符串。我假设你这样写是因为你第一次尝试没有双引号,例如,你得到了一个json语法错误。这并不奇怪:Json文件是数据,而不是代码,它们不能包含表达式或变量引用。要么将配置放在你包含的python文件中,而不是加载json,要么将依赖项移动到代码中。或者两者兼而有之。
在python文件
config.py
中:在
helper.py
中:tcomlyy62#
这里是一个基本的配置系统。我不会添加输出,因为它需要截图,但它适用于bash/macos.Inspired by和[tip_colors_and_formatting]
从(https://misc.flogisoft.com/bash/tip_colors_and_formatting):
在Bash中,字符可以通过以下语法获得:
\e \033 \x1B
\e
不起作用,所以我继续使用\x1B
,因为它在链接的SE答案中起作用。