可选的位置参数提升ValueError

时间:2015-09-30 20:32:40

标签: python sqlalchemy crud traceback optional-arguments

我已经构建了CRUD API来处理database。表Retrievefunction的{​​{1}}(或阅读)class目前正在向我提出问题。有关设计的背景:assessment_results还有一个便捷文件,它继承自主文件(object.py),以接受API值。

它需要做什么:检查string和/或检查两个参数(如果ID未被使用)。如果适当的话,如果其中一个或其他,请将其与其详细信息一起检索。 在docs on Python之后,我引入了参数ID以允许可选的位置参数。我也从这个伟大的tutorial.得到了帮助(我是设计和构建dbs并使用python的新手。)

我认为检索方法有效,但*的设计或方法必定存在缺陷,因为create_category_rating(...)现在返回Traceback。我在这里阅读Stacks(一个类似的问题),我可能需要为args分配一个值,但似乎我通过API。

代码如下:

object.py

(检索方法和create_category_rating方法):

ValueError

convenience.py 继承自object.py

def retrieve_assessment_results(self, something_unique, *args):
    if isinstance(something_unique, int):
        return self.session.query(Assessment_Results).\
        filter(Assessment_Results.id == something_unique).one()
    elif isinstance(something_unique, basestring) and isinstance(args, basestring):
        return self.session.query(Assessment_Results).\
        filter(Assessment_Results.owner == something_unique).\
        filter(Assessment_Results.assessment == args).one()
    elif isinstance(something_unique, Assessment_Results) and isinstance(args, Assessment_Results):
        return something_unique, args
    else:
        raise ValueError('Value being passed is an object')

def create_category_rating(self, category_rating_int, category, assessment_results):
    new_catrating = Category_Rating(category_rating_int, category, assessment_results)
    self.session.add(new_catrating)
    print(new_catrating)
    self.session.commit()
    return(new_catrating)

test.py

def create_category_rating(self, category_rating_int, category_name, username, name):
    category = self.retrieve_category(category_name)
    owner = self.retrieve_user(username)  
    assessment = self.retrieve_assessment(name)  
    assessment_results = self.retrieve_assessment_results(owner, assessment)
    return super(ConvenienceAPI, self).create_category_rating(category_rating_int, category, assessment_results)


当前问题:StatementError 根据建议,更改条件(需要解压缩并分配由* args给出的元组)。

新API:

api = ConvenienceAPI()
api.create_category_rating(2, 'Decision-Making', 'baseball', 'Becoming a Leader')

TRACEBACK:

def retrieve_assessment_results(self, *args):
    id, assessment, owner = None, None, None
    if len(args) == 1:
        id, = args[0]
    elif len(args) == 2:
        assessment, owner = args
    else:
        raise ValueError('Value being passed is an object')
    if id is not None:
        return self.session.query(Assessment_Results).\
        filter(Assessment_Results.id == id).one()
    elif assessment is not None:
        return self.session.query(Assessment_Results).\
        filter(Assessment_Results.assessment == assessment).one()
    elif owner is not None:
        return self.session.query(Assessment_Results).\
        filter(Assessment_Results.owner == owner).one()

1 个答案:

答案 0 :(得分:0)

我想我可能已经发现了这个问题:

elif isinstance(something_unique, basestring) and isinstance(args, basestring):

" ARGS"不是一个基本字符串:你需要检查每个单独的参数,看它是否是一个基本字符串。

... and reduce(lambda x, y: x and isinstance(y, basestring), [a for a in args], True)