pyrsistent icon indicating copy to clipboard operation
pyrsistent copied to clipboard

Public introspection API for fields and checked types

Open itamarst opened this issue 10 years ago • 4 comments
trafficstars

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.

itamarst avatar Aug 11 '15 18:08 itamarst

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?

tobgu avatar Aug 12 '15 05:08 tobgu

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

itamarst avatar Aug 12 '15 11:08 itamarst

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.

tobgu avatar Aug 13 '15 05:08 tobgu

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

itamarst avatar Aug 13 '15 15:08 itamarst