【问题标题】:hasattrr to check properties of a object in pythonhasattrr 检查python中对象的属性
【发布时间】:2019-09-19 13:01:35
【问题描述】:

我正在使用 Python 烧瓶编写 Web 服务。我创建了一个类并从用户输入(服务调用提供的 json 数据)加载其属性名称和值。

from flask import json
class DataSetContract(object):
    """description of class"""

    def __init__(self, j):
        self.__dict__ = json.loads(j)

我还获得了一个值属性名称列表,作为我的服务的其他输入的一部分。

无法实现... 例如属性列表... {"from value","To Value","some values"}

属性名称中包含空格。

我在另一个类中保存这些属性名称

class FxConvertContract(object):
    """description of class"""

    def __init__(self, j):
        self.INPUT_CURRENCY = ""
        self.INPUT_AMOUNT = "" 
        self.RETURN_CURRENCY = ""
        self.RETURN_VALUE = ""
        self.ROUNDING = ""
        self.RETURN_RATE = ""
        self.__dict__ = json.loads(j)

现在的目标是如何验证列表中的所有属性是否都已正确填充并且没有丢失。

我尝试了 'in' 和 'hasattr' 方法,但没有任何效果。

class DataSetValidator(object):

    def validate(self,dsList,convert):
        if(dsList == None or len(dsList) < 1):
            raise BadRequest("either Convert List or Data Set Source required.")

        for item in dsList:
            if(convert.INPUT_CURRENCY in item):
                raise BadRequest("INPUT_CURRENCY property not found.")
            if(hasattr(item,convert.INPUT_AMOUNT) == False):
                raise BadRequest("INPUT_AMOUNT property not found.")
            if(hasattr(item,convert.RETURN_CURRENCY) == False):
                raise BadRequest("RETURN_CURRENCY property not found.")
            if(hasattr(item,convert.RETURN_VALUE) == False):
                raise BadRequest("RETURN_VALUE property not found.")

        return True

谁能知道我如何验证数据对象是否包含所有属性。

提前谢谢...

【问题讨论】:

    标签: python hasattr


    【解决方案1】:

    假设这是您想要做的,hasattr 将起作用:

    In [1]: from flask import json 
       ...: class DataSetContract(object): 
       ...:     """description of class""" 
       ...:  
       ...:     def __init__(self, j): 
       ...:         self.__dict__ = json.loads(j) 
       ...:                                                                                                                                                                 
    
    In [2]: class FxConvertContract(object): 
       ...:     """description of class""" 
       ...:  
       ...:     def __init__(self, j): 
       ...:         self.INPUT_CURRENCY = "" 
       ...:         self.INPUT_AMOUNT = ""  
       ...:         self.RETURN_CURRENCY = "" 
       ...:         self.RETURN_VALUE = "" 
       ...:         self.ROUNDING = "" 
       ...:         self.RETURN_RATE = "" 
       ...:         self.__dict__ = json.loads(j) 
       ...:                                                                                                                                                                 
    
    In [3]: class DataSetValidator(object): 
       ...:  
       ...:     def validate(self, dsList, convert): 
       ...:         if(dsList is None or len(dsList) < 1): 
       ...:             raise BadRequest("either Convert List or Data Set Source required.") 
       ...:  
       ...:         for item in dsList: 
       ...:             if(not hasattr(item, convert.INPUT_CURRENCY)): 
       ...:                 raise BadRequest("INPUT_CURRENCY property not found.") 
       ...:             if(not hasattr(item, convert.INPUT_AMOUNT)): 
       ...:                 raise BadRequest("INPUT_AMOUNT property not found.") 
       ...:             if(not hasattr(item, convert.RETURN_CURRENCY)): 
       ...:                 raise BadRequest("RETURN_CURRENCY property not found.") 
       ...:             if(not hasattr(item, convert.RETURN_VALUE)): 
       ...:                 raise BadRequest("RETURN_VALUE property not found.") 
       ...:  
       ...:         return True 
       ...:                                                                                                                                                                 
    
    In [4]: class BadRequest(Exception): pass                                                                                                                               
    
    In [7]: contract = FxConvertContract("""{ 
       ...:     "INPUT_CURRENCY": "in_currency", 
       ...:     "INPUT_AMOUNT": "in_amount", 
       ...:     "RETURN_CURRENCY": "re_currency", 
       ...:     "RETURN_VALUE": "re_value", 
       ...:     "ROUNDING": "rounding", 
       ...:     "RETURN_RATE": "re_rate" 
       ...: }""")                                                                                                                                                           
    
    In [8]: data = DataSetContract("""{ 
       ...:     "in_currency": "USD", 
       ...:     "in_amount": 1, 
       ...:     "re_currency": "CAD", 
       ...:     "re_value": 1.33, 
       ...:     "rounding": 0, 
       ...:     "re_rate": 1.33 
       ...: }""")                                                                                                                                                           
    
    In [9]: validator = DataSetValidator()                                                                                                                                  
    
    In [12]: validator.validate([data], contract)                                                                                                                            
    Out[12]: True
    

    【讨论】:

      【解决方案2】:

      你可以做一些像这样聪明又愚蠢的事情

      fields = [
          'INPUT_CURRENCY', 
          'INPUT_AMOUNT', 
          'RETURN_CURRENCY', 
          'RETURN_VALUE', 
          'ROUNDING', 
          'RETURN_RATE'
      ]
      data = json.loads(j)
      test = [f in data for f in fields]  # a list of booleans
      if not all(test):
          idx = test.index(False)
          raise BadRequest("%s property not found." % fields[idx])
      

      【讨论】:

        猜你喜欢
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        相关资源
        最近更新 更多