tobgu / pyrsistent

Persistent/Immutable/Functional data structures for Python
MIT License
2.03k stars 147 forks source link

Public introspection API for fields and checked types #47

Open itamarst opened 9 years ago

itamarst commented 9 years ago

We're about to add some code that introspects pyrsistent classes - in particular PRecord/PClass and the checked data structures - in order to detect changes to our pyrsistent-based configuration model. You can see a sketch of this code here: https://github.com/ClusterHQ/flocker/pull/1836/files#diff-c03885f8c4e64651ea9a499e99090a83R28

Unfortunately this currently requires using private pyrsistent APIs. It would be good to have a public API for finding this information. As a first pass it seems that adding this as extra methods to the classes themselves is problematic, insofar as it means subclasses get extra methods they weren't expecting. So maybe there should be a set of public external functions that extract information from the private implementation details.

tobgu commented 9 years ago

Sounds like a good idea!

I'm thinking along the lines of a public function (introspect?) taking the class as argument and calling a private method (introspect?) that does the actual introspection. It would return a dict/pmap with information about the class. Eg:

class Foo(PRecord):
     __invariant__ = lambda r: (r.y >= r.x, 'Blam!')
     x = field(type=int)
     y = field(type=int)

>>> introspect(Foo)
pmap({'__invariant__': ..., 'fields': pmap({'x': pmap({'type': (int,), ...}), ...})})

That's pretty much how I interpret your thoughts. Am I right?

itamarst commented 9 years ago

Something like that, yeah. Possibly the field info could be represented by a PRecord or PClass, to make it simpler to use, but yeah.

tobgu commented 9 years ago

OK, I'll see what I can come up with unless you have something you want to contribute with. Perhaps this weekend if I can find some time.

itamarst commented 9 years ago

Probably won't have time, but I can show you what I ended up using: https://github.com/ClusterHQ/flocker/pull/1842/files#diff-c03885f8c4e64651ea9a499e99090a83R30