On 9/21/15 4:08 PM, Cliff Hill wrote:
So, I have some code that is constructing a declarative table definition on the fly, built from a YAML file. It works great. However, when I try to do *help(tablename)*, I get the following error:

    Python 3.4.3 (default, May 14 2015, 09:48:44)
    [GCC 4.3.4 [gcc-4_3-branch revision 152973]] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from pampas.sql import tables
    >>> tables.pampas.Plugin
    <class 'pampas.sql.tables.pampas.Plugin'>
    >>> help(tables.pampas.Plugin)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/_sitebuiltins.py", line
    103, in __call__
        return pydoc.help(*args, **kwds)
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/pydoc.py", line 1827,
    in __call__
    self.help(request)
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/pydoc.py", line 1877,
    in help
        else: doc(request, 'Help on %s:', output=self._output)
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/pydoc.py", line 1614,
    in doc
    pager(render_doc(thing, title, forceload))
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/pydoc.py", line 1607,
    in render_doc
        return title % desc + '\n\n' + renderer.document(object, name)
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/pydoc.py", line 372, in
    document
        if inspect.isclass(object): return self.docclass(*args)
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/pydoc.py", line 1272,
    in docclass
        for name, kind, cls, value in classify_class_attrs(object)
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/pydoc.py", line 205, in
    classify_class_attrs
        for (name, kind, cls, value) in
    inspect.classify_class_attrs(object):
      File "/lfs/opt/qqpamp0/pkg/lib/python3.4/inspect.py", line 405,
    in classify_class_attrs
        obj = get_obj or dict_obj
      File
    
"/lfs/opt/qqpamp0/venv/cliff/lib/python3.4/site-packages/sqlalchemy/sql/elements.py",
    line 539, in __bool__
        raise TypeError("Boolean value of this clause is not defined")
    TypeError: Boolean value of this clause is not defined


Mind you, this only happens if I try to do help() on my table. It doesn't come up otherwise. I have warned people using my API in my company away from using help(), and instead relying on the table definition in the database and/or the YAML files.

this is a bug in Python itself which I provided a fix for in http://bugs.python.org/issue23898. It appeared in 3.4 and is fixed in Python 3.5.



Essentially, what is done is:

 1. Code looks up a YAML definition locally for the table.
 2. if the file doesn't exist, it uses DB reflection to construct the
    file.
 3. Load the YAML file
 4. Use the YAML file to construct the required namespace dict to pass
    to sqlalchemy.ext.declarative.api.DeclarativeMeta(), using my
    existing declarative_base instance for the base class of my new class.
 5. Returns the class definition constructed
    from sqlalchemy.ext.declarative.api.DeclarativeMeta(). (note, I
    have used type() rather
    than sqlalchemy.ext.declarative.api.DeclarativeMeta() with the
    same results).

This all works well, and I am very happy it does. However, where it is lacking is that help() is broken. When I make a table statically, I have no such problem. When I am attempting to construct it dynamically, I run into this problem.
I'm not sure why the issue doesn't appear under some circumstances; if you have a DeclarativeMeta type of structure, it should consist of the same elements no matter how the class structure was generated.





I have considered constructing the class definition completely as a string, and then exec() the whole thing, as this could work for me. However I'd hope there was a solution that wouldn't involve such a heavy-handed alteration to my code.

I am running SQLAlchemy 1.0.8, on Python 3.4.3.

Thanks for any help.

--
You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to