我有一个test.txt文件,现在有2行
not False == True
not True == True
我正在尝试将其导入到函数中,以便它将显示带有输入的文本,然后实际执行布尔计算 然后针对每一行再次执行此操作。它适用于第6行的输入,但第7行不起作用,我知道为什么,我只是不知道如何去做我想做的事情...
def calc (read):
line = read.readline()
if line:
lines = line.strip()
input(f"Does {lines}?>")
print(f"{lines}")
return calc(boolfile)
boolfile = open("test.txt")
calc(boolfile)
答案 0 :(得分:1)
f字符串只能计算在f字符串内部的字面意义上的表达式。
如果您希望像对待源代码一样评估包含表达式表示形式的字符串,则需要使用eval
。
const HEADING_OPTION = Object.freeze({
H1: 1,
H2: 2,
H3: 3,
H4: 4,
H5: 5,
H6: 6,
});
type HeadingOption = $Values<typeof HEADING_OPTION>;
let h1: HeadingOption = HEADING_OPTION.H1; // OK
h1 = 1; // OK
// $Expect error: Cannot assign `999` to `h1` because number is incompatible with enum
h1 = 999;
几乎总是一个坏主意有很多原因(tl; dr:任何可以更改您传递给eval
的输入的人都可以让您运行他们想要的任何代码)。但是,如果这确实是您要执行的操作,那就是执行此操作的方法:
eval
如果您想做更安全的事情,唯一可以做的就是将代码解析和解释为比“任何Python表达式”更安全的事情。这并不像听起来那样难(特别是因为,如果您的语言是Python的确切子集,您可以只使用ast
模块进行解析,而只需要编写解释器部分),但是不完全是单线的。
答案 1 :(得分:0)
似乎您正在寻找eval
。
试试这个:
def calc (read):
line = read.readline()
if line:
lines = line.strip()
input(f"Does {lines}?>")
print(eval(lines))
return calc(boolfile)
boolfile = open("test.txt")
calc(boolfile)
输出:
Does not False == True?>
True
Does not True == True?>
False