首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引发ValueError的可选位置参数

引发ValueError的可选位置参数
EN

Stack Overflow用户
提问于 2015-09-30 20:32:40
回答 1查看 358关注 0票数 1

我已经构建了一个用于使用CRUD APIdatabaseRetrieve(或Read) function用于表classassessment_results目前给了我一些问题。关于设计的背景:API还有一个从主文件(object.py)继承来接受string值的方便文件。

它需要做的是:检查一个ID和/或检查两个参数(如果没有使用ID )。如其中一人或另一人(如适当),则将其连同其详情一并取回。在Python文档之后,我引入了参数*以允许可选的位置参数。我也帮助过这个伟大的教程。 (我是一个设计、构建dbs和使用python的新手)。

我相信检索方法是有效的,但是create_category_rating(...)的设计或方法肯定存在缺陷,因为Traceback正在返回一个ValueError。我在这里读到了堆叠 (类似的问题),我可能需要为args分配一个值,但我似乎通过了API。

守则如下:

object.py

(检索方法和create_category_rating方法):

代码语言:javascript
复制
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)

convenience.py (继承自object.py)

代码语言:javascript
复制
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)

test.py

代码语言:javascript
复制
api = ConvenienceAPI()
api.create_category_rating(2, 'Decision-Making', 'baseball', 'Becoming a Leader')

当前问题:根据建议更改条件(需要解压缩和分配*args提供的元组)。

新API:

代码语言:javascript
复制
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()

回溯:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/ack/code/venv/NotssDB/notssdb/test/test.py", line 111, in test1
    api.create_category_rating(2, 'Decision-Making', 'baseball', 'Becoming a Leader')
  File "/Users/ack/code/venv/NotssDB/notssdb/api/convenience.py", line 41, in create_category_rating
    assessment_results = self.retrieve_assessment_results(owner, assessment)
  File "/Users/ack/code/venv/NotssDB/notssdb/api/object.py", line 323, in retrieve_assessment_results
    filter(Assessment_Results.assessment == assessment).one()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2472, in one
    ret = list(self)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2515, in __iter__
    return self._execute_and_instances(context)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2530, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 914, in execute
    return meth(self, multiparams, params)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1078, in _execute_context
    None, None)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1339, in _handle_dbapi_exception
    exc_info
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1073, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 544, in _init_compiled
    grp, m in enumerate(parameters)]
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 498, in construct_params
    pd[self.bind_names[bindparam]] = bindparam.effective_value
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 1162, in effective_value
    return self.callable()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1386, in _go
    value = fn(*arg, **kw)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2422, in _get_state_attr_by_column
    return state.manager[prop.key].impl.get(state, dict_, passive=passive)
StatementError: (exceptions.KeyError) 'assessment_id' [SQL: u'SELECT assessment_results.id AS assessment_results_id, assessment_results.created_on AS assessment_results_created_on, assessment_results.owner_id AS assessment_results_owner_id, assessment_results.assessment_id AS assessment_results_assessment_id \nFROM assessment_results \nWHERE ? = assessment_results.assessment_id'] [parameters: [immutabledict({})]]
EN

回答 1

Stack Overflow用户

发布于 2015-09-30 21:05:06

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

代码语言:javascript
复制
elif isinstance(something_unique, basestring) and isinstance(args, basestring):

"args“不是基线:您需要检查每个单独的参数,以确定它是否是基弦。

代码语言:javascript
复制
... and reduce(lambda x, y: x and isinstance(y, basestring), [a for a in args], True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32875107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档