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

Jul*_*nec 2 python optimization sqlalchemy python-2.7

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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")
Run Code Online (Sandbox Code Playgroud)

bru*_*ers 5

这是否属于"不良副作用"?

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'
Run Code Online (Sandbox Code Playgroud)

或者更有趣:

class Bar(object): 
    pass

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

现在只有受信任的代码才能实现你的课程,这里没有真正的安全问题 - 所有这些都可以在初始化程序之外完成.但显而易见会使代码更具可读性,并且有助于在这里和那里捕获一些错字.