hasattrr для проверки свойств объекта в python - PullRequest
0 голосов
/ 19 сентября 2019

Я пишу веб-сервисы с использованием фляги Python.Я создал класс и загружаю его имена свойств и значения из пользовательского ввода (данные json, предоставляемые с вызовом службы).

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

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

Я также получаю список имен свойств значений как часть другого ввода в мойservice.

невозможно получить ... список свойств, например ... {"from value", "To Value", "некоторые значения"}

имена свойств содержат пробелы.

У меня есть другой класс, в котором я сохраняю имена этих свойств

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

Может кто-нибудь знать, как я могу проверить, содержит ли объект данных все свойства.

Заранее спасибо ...

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Предполагая, что это то, что вы пытаетесь сделать, 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
0 голосов
/ 19 сентября 2019

Вы могли бы сделать что-нибудь умное и глупое, как это

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])
...