• Re: extend behaviour of assignment operator

    From Dieter Maurer@21:1/5 to Guenther Sohler on Wed Jan 10 19:44:31 2024
    Guenther Sohler wrote at 2024-1-9 08:14 +0100:
    when i run this code

    a = cube([10,1,1])
    b = a

    i'd like to extend the behaviour of the assignment operator
    a shall not only contain the cube, but the cube shall also know which >variable name it
    was assigned to, lately. I'd like to use that for improved user interaction.

    `Acquisition` (--> `PyPI`) implements something similar.

    It does not work for variables -- but for attribute access.
    Look at the following code:

    ```
    from Acquisition import Implicit

    class AccessAwareContainer(Implicit):
    ...

    class AccessAwareContent(Implicit):
    ...

    container = AccessAwareContainer()
    container.content = AccessAwareContent()
    ```

    When you now assign `content = container.content`, then
    `content` knows that it has been accessed via `container`.


    If fact `content` is not a true `AccessAwareContent` instance
    but a wrapper proxy for it. It mostly behaves like an
    `AccessAwareContent` object but has additional information
    (e.g. it knows the access parent).


    It works via a special `__getattribute__` method, essentially
    implemented by:

    ```
    def __getattribute__(self, k):
    v = super().__getattribute__(k)
    return v.__of__(self) if hasattr(v, "__of__") else v
    ```

    Your use case could be implemented similarly (again not for variables
    and all objects, but for special classes (and maybe special objects)).

    Your `__getattribute__` could look like:
    ```
    def __getattribute__(self, k):
    v = super().__getattribute__(k)
    try:
    v.name = k
    except TypeError: pass
    return v
    ```

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Stefan Ram@21:1/5 to Guenther Sohler on Wed Jan 10 19:40:49 2024
    Guenther Sohler <guenther.sohler@gmail.com> writes:
    i'd like to extend the behaviour of the assignment operator

    The following attempt is just a proof of concept, as it will
    not handle properly all possible code. To do something similar
    in a more general way, use "import ast", parse the code into
    an AST and then search the AST for assignements and insert
    code to change the name attribute after them.

    import re

    class thing: pass # all things pass

    code = r'''
    a = thing()
    print( a.name )
    b = a
    print( b.name )
    '''

    code = \
    re.sub\
    ( r'((?:^|\n)(\s*)([\w_]+)\s*=.*(\n|$))', r'\1\2\3.name="\3"\n', code )
    exec( code )

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)