On Tue, May 25, 2021 at 12:14 PM Steven D'Aprano <st...@pearwood.info>
wrote:

> On Tue, May 25, 2021 at 10:55:07AM +0200, Stéfane Fermigier wrote:
>
> > I had a similar idea ~8 years ago while working on a RAD (rapid
> application
> > development) framework [*] that had to manage business objects using a
> > variety of frameworks: an ORM (SQLAlchemy), a full-text engine (Whoosh),
> as
> > well as a specifically developed CRUD Web UI framework, permission
> system,
> > audit system, etc.
> >
> > In this context, variable decorators, in addition to type annotations,
> > could bring a whole new level of internal DSL expressivity, including for
> > instance:
>
> Could you explain exactly how this proposed feature would allow us to do
> all the things you say it would allow us to do? It's not clear to me how
> knowing the binding name on the left would allow us to "express data
> access constraints" etc.
>

I was thinking at the framework level, e.g. the decorator would be use to
register some metadata somewhere (either class-level or in a global
registry, say), and the framework would be to check permission against the
current user when accessing the object's field (e.g. at serialisation /
deserialisation time, and/or when rendering templates).

For all the things I have suggested, what I have in mind is just:

1) Register some metadata at decorator execution time
2) The framework uses these metadata when it needs them


> E.g. you say:
>
> > - Annotations to express full-text search indexability (e.g. @indexed)
>
> I don't even know how to begin interpreting how you get there from the
> proposed syntax:
>
>     @function(args) name
>     # -> `name = function('name', args)`
>

For the use cases I have in mind, some kind of context information would
need to be passed too, like:

class Customer:

    @permissions({"read": USER, "write": MANAGER})
    first_name: str

the function primary_key should be called with the class being constructed
for it to make sense.

Here are some alternatives:

1) Set metadata directly on some magical attribute:

class Customer:
    __permissions__ = {
        'first_name': { READ: ..., WRITE: ... }
    }

    first_name: str

cons: risk of mispelling or forgetting some attributes; lack of locality;
how do we deal with inheritance ?

1bis):

class Customer:
    class Meta:
        permissions__ = {
            'first_name': { READ: ..., WRITE: ... }
        }

    first_name: str

This is similar to the previous one, so same issues.

2) Dexterity syntax (I'm not a user of Dexterity, so I might be wrong, this
is from:
https://www.stevemcmahon.com/classes/dexterity/dexterity%20class%202013.pdf
):

class Customer:
    dexterity.read_permission(
        first_name='cmf.ReviewPortalContent'
    )
    dexterity.write_permission(
        first_name='cmf.ReviewPortalContent'
    )
    first_name: str

con: easy to misspell the field name (hopefully the rest of the issues is
taken care by the framework)

3) One possible idiom to use decorators as I think would be fit, without
changing the language, but at the price of an extra line and some
additional mental burden:

class Customer:
    first_name: str

    @acl({"read": USER, "write": MANAGER})
    def meta_first_name(self): pass

I.e. use a method decorator on a dummy function named similarly to the
variable (e.g. by prepending some magical prefix).

The obvious con is that we still haven't prevented the risk of typo in the
function name.

[...] As I see it, objects should almost never know or care what names
> (note
> plural) they are known by, or even if they are bound to any names at
> all. There are a few exceptions, mostly classes and sympy symbols, but
> I expect that this functionality should be rather niche.
>

For the kind of applications I have been doing over the last 20 years
(enterprise content and information management applications), this is not
niche, this is where 50% of the work goes (i.e. defining object models,
permissions, workflows, forms, validation, etc.).

  S.

-- 
Stefane Fermigier - http://fermigier.com/ - http://twitter.com/sfermigier -
http://linkedin.com/in/sfermigier
Founder & CEO, Abilian - Enterprise Social Software -
http://www.abilian.com/
Chairman, National Council for Free & Open Source Software (CNLL) -
http://cnll.fr/
Founder & Organiser, PyParis & PyData Paris - http://pyparis.org/ &
http://pydata.fr/
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/27YQVQTFUA2P6XTMA5ICCPUXOFZSQJQB/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to