Hello.

Just a really, really tiny and pedantic correction... The stack variable in the
code is in fact a queue. This could potentially surprise some users / readers.

To fix, please do one of the following:
* Rename stack local var to queue.
* Use stack.pop() to pop the last element from the stack.

HTH,

Ladislav Lenart


On 10.9.2015 15:48, Mike Bayer wrote:
> 
> 
> On 9/10/15 9:35 AM, Mike Bayer wrote:
>>
>>
>> On 9/10/15 8:48 AM, Pavel S wrote:
>>> Let's say, I have declarative classes A, B, C, D.
>>>
>>> A is the parent
>>> B has FK&relationship to A
>>> C has FK&relationship to B,
>>> D has FK&relationship to C etc...
>>>
>>> I'd like to implement _generic method_ walk(obj) which will recursively 
>>> yield
>>> dependent/related objects of obj (which is instance of A).
>>>
>>> I know that there is introspection interface inspect(), however I'm don't
>>> really understand how to use it properly in my use case.
>>>
>>> Shall I do inspect(obj) or rather inspect(obj.__class__) and then somehow
>>> apply inspection to obj?
>>>
>>> Are there an examples and best practices?
>> right now you can kind of get this effect using cascade_iterator:
>> http://docs.sqlalchemy.org/en/rel_1_0/orm/mapping_api.html?highlight=cascade_iterator#sqlalchemy.orm.mapper.Mapper.cascade_iterator
>>
>> the limitation is that right now its based on relationship cascade settings,
>> as that's what it was intended for, so you'd probably want to use 
>> "save-update":
>>
>> insp = inspect(my_object)
>> for obj in insp.mapper.cascade_iterator("save-update", insp):
>>    # ...
>>
>> to implement your own system, the graph of objects is strictly based on
>> relationship.   so walk() is pretty simple:
>>
>> def walk(obj):
>>     yield obj
>>     insp = inspect(obj)
>>     for relationship in insp.mapper.relationships:
>>         related = getattr(obj, relationship.key)
>>         if relationship.uselist:
>>             for collection_member in related:
>>                 for walk_related in walk(collection_member):
>>                     yield walk_related
>>         elif related is not None:
>>             for walk_related in walk(related):
>>                 yield walk_related
> 
> here's one im putting in the FAQ for now, which solves recursion depth as well
> as cycles:
> 
>     def walk(obj):
>         stack = [obj]
> 
>         seen = set()
> 
>         while stack:
>             obj = stack.pop(0)
>             if obj in seen:
>                 continue
>             else:
>                 seen.add(obj)
>                 yield obj
>             insp = inspect(obj)
>             for relationship in insp.mapper.relationships:
>                 related = getattr(obj, relationship.key)
>                 if relationship.uselist:
>                     stack.extend(related)
>                 elif related is not None:
>                     stack.append(related)
> 
> 
> 
> 
>>
>>
>>
>>
>>
>>
>>> -- 
>>> 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]
>> <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]
> <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