如何使用声明性logi编写python脚本

2024-09-26 18:01:50 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个复杂的问题(至少对我来说是这样),我希望有一本书/网站/博客可以让我有一个起点。有人能告诉我在哪里可以找到用python编写脚本的信息,在那里它读取一堆逻辑语句,并将该逻辑应用于正在读入的一堆数据?我可以用一种非声明的方式来完成这项工作,但这意味着任何时候有一个新的逻辑语句,我都需要编写新的代码来处理它。如果我可以编写一些可以解释逻辑语句的通用脚本,那么我就不需要继续编写代码来跟上新的逻辑语句。在

我要做的是我有3个文件我的脚本将读取。两个长度相等的文件包含两个度量的值。第三个是包含逻辑语句的文件。我希望脚本读入逻辑语句,并将这些语句应用于数字,并在满足这些语句的情况下编写消息。在

例如,文件1将包含:

1
2
3
4
5
6

文件2将包含:

^{pr2}$

文件3将包含:

m1 >=3 && (m1 + m2) >= 11

如果我运行我的脚本,我希望它输出

m1 = 4 and m2 = 8 fulfills condition m1 >= 3 && (m1 + m2) >= 11
m1 = 5 and m2 = 10 fulfills condition m1 >= 3 && (m1 + m2) >= 11

Tags: and文件数据代码脚本信息声明网站
3条回答

如果您信任数据并且可以用Python语法编写逻辑语句,那么可以使用^{}并为其提供表达式和两个值:

>>> eval('m1 >=3 and (m1 + m2) >= 11', {'m1':4, 'm2':8})
True
>>> eval('m1 >=3 and (m1 + m2) >= 11', {'m1':4, 'm2':-8})
False

对于“if you trust it”,我的意思是它不应该包含像“delete my whole hard disk”这样的函数调用。因为eval会运行它。在


我得自己试试。。。在

^{pr2}$

我会使用eval函数。在

>>> m1 = 10
>>> m2 = 30
>>> statement = 'm1 < m2 and m2 == 30'
>>> eval(statement)
True

警告eval()以python代码的形式执行所有内容,所以如果用户可以输入语句,他就可以运行任何东西。在某些网站上可能非常危险。您总是可以在求值之前分析语句。在

安全检查示例:

^{pr2}$

只使用允许的标记(白名单)。很可能需要向safe_tags添加samo more标记

按照@AdamSmith的建议,使用SQL进行操作。问题是condition仍然容易受到SQL注入攻击,因此与eval相比并没有任何优势

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()

file1 = [1, 2, 3, 4, 5, 6]
file2 = [2, 4, 6, 8, 10, 3]

c.execute('''CREATE TABLE m (m1, m2)''')
for m1, m2 in zip(file1, file2):
    c.execute('''INSERT INTO m VALUES(?, ?)''', (m1, m2))

condition = '''m1 >=3 AND (m1 + m2) >= 11'''
c.execute('''SELECT m1, m2 FROM m WHERE ''' + condition)
for m1, m2 in c.fetchall():
    print "m1 = {} and m2 = {} fulfills condition {}".format(m1, m2, condition)

相关问题 更多 >

    热门问题