5

这是一个示例类:

from datetime import datetime
class Article:
    published = datetime.now()
    for propname in "year month day hour minute second".split():
        exec "%s = property(lambda self: self.published.%s)"%(propname, propname)
    del propname

如您所见,我正在使用exec优化多个property()对象的创建。我经常读到使用exec是不好的,它是你程序中的一个安全漏洞。在这种情况下,是吗?

4

2 回答 2

6

在这种情况下,它并不是真正的安全威胁,因为当执行的字符串是用户可以访问的内容时,就会出现安全威胁。在这种情况下,它是一个拆分字符串文字。

然而,即使它不是安全风险,exec也几乎总是一个糟糕的选择。为什么不使用getattrandsetattr来代替?

from datetime import datetime
class Article:
    published = datetime.now()

    def __init__(self):
        for propname in "year month day hour minute second".split():
            setattr(self, propname, getattr(self.published, propname))

一个缺陷是这必须在__init__方法中完成,因此这取决于您是否有充分的理由不将其包含在其中。

于 2012-05-12T04:58:05.637 回答
0

exec与可信数据一起使用是可以的;但是,在这种情况下,它不是必需的,并且会减慢您的脚本速度。

于 2012-05-12T05:55:18.187 回答