python - 使用 **kwargs 初始化类是否存在安全问题?

标签 python python-2.7 optimization sqlalchemy

我最近开始在 __init__() 中使用 **kwargs 来初始化一个对象,因为在添加另一个属性时我不必对该函数进行任何更新。我只是将它们作为参数传递,然后循环完成工作。

class Customer(Base):
    """Model that defines a customer entity"""

    __tablename__ = "customers"

    date_created = Column(DateTime)
    date_modified = Column(DateTime)

    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

但是,根据您的经验,这样做是否存在安全问题?与下面明确定义将要初始化的内容的代码相比,我们是否会遇到不需要的副作用?

class Customer(Base):
    """Model that defines a customer entity"""

    __tablename__ = "customers"

    date_created = Column(DateTime)
    date_modified = Column(DateTime)

    def __init__(self, attrs):
        self.date_created = attrs.get("date_created")
        self.date_modified = attrs.get("date_modified")

最佳答案

这是否符合“不需要的副作用”的条件?

class Foo(object):
    def __init__(self, name, **kw):
        self.name = name
        for k, v in kw.items():
            setattr(self, k, v)


f = Foo("Bob", __dict__={"aaa":1, "bbb":2, "name":"HEHEHE"})
f.name
>>> 'HEHEHE'

或者为了更有趣:

class Bar(object): 
    pass

f = Foo("Bob", __dict__={"aaa":1, "bbb":2, "name":"HEHEHE"}, __class__=Bar)
type(f)
>>> <class '__main__.Bar'>

现在,只要只有受信任的代码实例化您的类,这里就没有真正的安全问题——所有这些实际上也可以在初始化程序之外完成。但是,明确说明代码的可读性更高,并且有助于发现一些拼写错误。

关于python - 使用 **kwargs 初始化类是否存在安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45817377/

相关文章:

python - pip 安装错误。找不到 Setuptools.command

c++ - C/C++编译器可以以任何方式内联C回调函数吗?

javascript - 在 Javascript 中优化和实现冗长的函数数组

python - 如何用OpenCV放大颜色差异?

Python:命令行参数的传递方式与硬编码行不同

python - Flask Babel 的翻译接口(interface)

python - 如何将base64字符串解码为其原始图像并在不保存的情况下打开它

python - 加载的 pickle 数据在内存中比在磁盘上大得多并且似乎泄漏了。 ( python 2.7)

java - 我如何(漂亮地)将这部分代码提取到子类中?

python - 为什么 QtGui.QApplication 工作但在 PyDev 中标记为未定义?