[Python-ideas] unify usage of mutable and immutable objects

Ryan Birmingham rainventions at gmail.com
Tue Feb 28 10:19:03 EST 2017


I'm sorry for the confusion, but what is frozen_tree_set() here, and what
is ipop? frozensets don't have pop or 'ipop', so my apologies that I'm a
bit lost here.

-Ryan Birmingham

On 28 February 2017 at 08:59, 语言破碎处 <mlet_it_bew at 126.com> wrote:

>
> Hi!
>     I write a '<'-based immutable set class.
>     But it is quit different from the standard set class.
>     I wish collections.abc.Set be more friendly to immutable tree sets or
>     Python add new syntax to unify such difference.
>
>
> good example:
>     a = []
>     a += a  # "a" is the original list
>
>     a = ()
>     a += a  # "a" is a new tuple
>
> bad example:
>     a = set()
>     a.add(1)        # return None; "a" changed
>     e = a.pop();
>
>     a = frozen_tree_set()
>     a = a.add(1)    # return another set;
>     e, a = a.ipop() # return two objects instead of one!
>
> solution I used:
>     a <<= 1         # <==> a = a.add(1)
>     but "a.ipop()" ....
> my current solution is to write a wrapper class
>     to turn immutable set into mutable set,
>     but it is so noisy to box and unbox.
>
>
> solution that I wish:
>     a :=.add(1)      # "=." mimic "+="; return the result object
>     e ~ a :=.pop()
>
>     d[key] :=.add(1) # in dict
>
>
>
> if only python add following features:
> 1) modify the original object
>     1-0)
>         1) define:
>         def .method(self):...
>         # "." means "intend to modify self"
>         #       return any thing
>         # to avoid immutable method
>         #       which was intended to return new object
>         #       leave self unchanged
>
>         2) invoke:
>         r = a..method();
>     1-1) ignore result
>         # no matter what returned, discard it
>         a.-.method();           # <==> [a..method(), None][-1]
>     1-2) return self
>         # no matter what returned, return self
>         a.>.method().>.method();# <==> [a..method(), a..method(), a][-1]
>
>
> 2) create new object
>     2-0)
>         1) define
>         # intend to return (result, new object)
>         def ^method():...
>
>         2)invoke:
>         r, a' = a.^method();
>     2-1) return other, discard result
>         a.-^method().-^method();# <==> a.^method()[1].^method()[1];
>     2-2) assign other to original variable
>         a=^method();            # <==> a = a.^method()[1];
>
> 3) unify both:
>     a :=.method();
>     # if   defined ".method" then "a..method();"
>     # elif defined "^method" then "a = a.^method()[1];"
>     # elif defined  "method" then "a.method();"
>     # else error
>
>     r ~ a :=.method();
>     # if   defined ".method" then "r = a..method();"
>     # elif defined "^method" then "r, a = a.^method();"
>     # elif defined  "method" then "r = a.method();"
>     # else error
>
>
>
>
>
>
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170228/23de4f5e/attachment-0001.html>


More information about the Python-ideas mailing list