以下是一个示例类:
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
是不好的,并且它是程序中的安全漏洞。在这种情况下,是吗?
答案 0 :(得分:6)
在这种情况下,它并不是真正的安全威胁,因为当执行的字符串是用户具有任何类型的访问权限时,就会出现安全威胁。在这种情况下,它是一个拆分字符串文字。
但是,即使这不是安全风险,exec
几乎总是一个糟糕的选择。为什么不使用getattr
和setattr
?
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__
方法中完成,所以这取决于你是否有充分的理由不将其包含在那里。
答案 1 :(得分:0)
将 exec 与可信数据一起使用是可以的;但是,在这种情况下,没有必要并且会减慢脚本速度。