getattr()没有'类对象'

时间:2016-11-24 10:17:20

标签: python mysql flask

如何在没有" Class"的情况下使用getattr?本身?

所以我遇到了这种情况:我有'列'那就是要求mysql按特定顺序查找特定数据。数据通过flask / apache打印,以便用户能够操作此数据。现在,从flask,POST下来,我接收到更改的(?)值,我将它们存储在python属性中。我需要检查这些属性中的值是否与原始数据中的值相同。当然,我可以硬核,但我希望有可能动态更改列。

columns = ["username", "email", "admin"]
data = ("john", "john@snow.com", "True")

username = "john"
email = "different@email.com"
admin = False

不确定我该如何处理?

for i in data:
  if i == getattr(???, 'username'):
    print("it's the same")

或类似的东西?:

for i in data:
   if i == getattr(data, '?????'):
     print("it's the same")

一切都在烧瓶内,我无法将其嵌入到Class本身中。所以我没有自我'等等 如果我可以创建课程,我可能会像

那样
class Myclass:
    def __init__(self):
        self.columns = ["username", "email", "admin"]
        self.data = ("john", "john@snow.com", "True")
        self.result = []
        self.username = "john"
        self.email = "different@email.com"
        self.admin = False

    def test(self):
        for i in self.data:
            if i == getattr(self, self.columns[self.data.index(i)]):
                self.result.append("same")
            else:
                self.result.append("different")
        return self.result

Myclass().test()

['相同','不同','不同']

2 个答案:

答案 0 :(得分:1)

Flask只是 Python代码。您可以创建一个类,并在适合您的用例时使用它。或者,如果您使用Flask-SQLAlchemy来管理数据库支持的数据,那么您无论如何都会拥有类和实例(并且可以更轻松地启动数据更新)。

类和实例不是唯一具有属性的对象;模块和函数也有属性(虽然你不会将数据作为属性存储在任何一个上),当你在任何方面查找方法时,你也在查找属性

选择存储,然后使用类的实例包装该存储,并使用getattr(),或者选择不同的数据结构并使用该数据结构的方法来获取不同的字段。例如,字典会使得获取给定名称的当前值变得微不足道。

如果您坚持使用实例,请注意在循环中您希望将列和data值压缩在一起:

for name, value in zip(columns, data):
    if getattr(self, name) == value:
        self.result.append("same")
    else:
        self.result.append("different")

请注意,您不必在前面添加"self."getattr()的全部内容与.语法的工作相同。

您可能希望将columnsdata列表放在一起作为词典

self.data = {'username': 'john', 'email': 'john@snow.com', 'admin': 'True'}

因为这就是你如何处理来自表单的POST数据;这样您可以迭代dict.items()对,或仅使用columns列表来访问值:

for name, value in self.data.items():
    # ...

或使用dict.get()检索值,允许缺少条目:

for name in self.columns:
    if getattr(self, name) == self.data.get(name):
        # ...

答案 1 :(得分:0)

事实证明我正在寻找简单的eval()。 getattr()是为不同目的而设计的。

这么简单:

for i in data:
  if i == eval(cols[data.index(i)]):
    print("it's the same")

做了这个伎俩