On 03/14/2017 10:02 AM, Антонио Антуан wrote:
Hi.
I use sqlalchemy 1.0.17, thanks for you great library :)

I have such code:
|


classFlagsMixin(object):
    @hybrid_method
    defexist_flag(self,flag):
        ifnotself.flags ornotflag:
            returnFalse
        returnself.flags &flag ==flag

    @exist_flag.expression
    defexist_flag(self,flag):
        returnand_(flag !=0,self.flags !=0,self.flags.op('&')(flag)!=0)


classSomeModel(Base,FlagsMixin,AnyOtherClass):
    # class attrs and methods

|


In case of optimization, I want to create sqlalchemy-free class,

what sort of optimization?  are you having a performance problem?


which
contains all methods and attributes of class. So, i wrote that code:

|


@staticmethod
def_get_sa_free_class(klass,with_mro=False):
    sa_free_cls =getattr(klass,'__sa_free_cls',None)

    ifsa_free_cls isNone:
        items ={}
        klasses =[klass]ifnotwith_mro elseklass.__mro__
        fork inklasses:
            forname,val ink.__dict__.items():
                ifname notinitems andname
notin['__mapper__','__dict__','__class__','_sa_class_manager','query','metadata']:
                    ifisinstance(val,InstrumentedAttribute):
                        items[name]=None
                    else:
                        items[name]=val
            formethod_name in('exist_flag',):
                items[method_name]=getattr(klass,method_name)
        sa_free_cls =type('Unbound'+klass.__name__,(object,),dict(items))
        sa_free_cls._sa_free =True

        sa_free_cls.__init__ =klass._sa_class_manager.original_init.im_func

        setattr(klass,'__sa_free_cls',sa_free_cls)
    returnsa_free_cls

So what you're trying to do is: 1. create a class 2. map it 3. then extract it into something unmapped. this seems backwards. Why not create your class as "unmapped", then make a subclass of it that is mapped?


class MyOptimizedClass(FlagsMixin):
    #  stuff


class MyMappedClass(MyOptimizedClass, Base):
    __tablename__ = ...

    # stuff


Or something like that, where you make use of your descriptor declaration directly instead of reverse engineering it.

Result class should has `exist_flag()` method, and it has to be used
always with `func` attribute of hybrid_property, neither `expr` (as I
want to have SQLA-free class).

As you can see, I want to ensure `exist_flag()` method existence in
result `klass` object, and if method called with `with_mro=False`.
But, of course, such a way can't allow this, because of descriptor logic
- return `expr` if instance not specified:

|
klass.exist_flag(1)
<sqlalchemy.sql.elements.BooleanClauseList object at 0x7f2a79b835d0>

|

Also, I tried to use this versions with same result - AttributeError(''):


|
klass.exist_flag.func
klass.exist_flag.__class__.func

well when you access the hybrid like that it gets invoked. you'd need to get it either as:

hybrid = klass.__class__.__dict__['exist_flag']

or

from sqlalchemy import inspect
mapper = inspect(klass)
hybrid = mapper.all_orm_descriptors.exist_flag


you probably want to be using mapper.all_orm_descriptors to help with your inspection.


...

AttributeError: 'function' object has no attribute 'func'

|

Is there any way to get `func` attribute of hybrid_method?
And also, maybe sqlalchemy already has some alternative to get
sqla-free-class?

Thank you again.
Anton.

--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and
Verifiable Example. See http://stackoverflow.com/help/mcve for a full
description.
---
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 sqlalchemy+unsubscr...@googlegroups.com
<mailto:sqlalchemy+unsubscr...@googlegroups.com>.
To post to this group, send email to sqlalchemy@googlegroups.com
<mailto:sqlalchemy@googlegroups.com>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to