Rocksolid Light

groups  faq  privacy  How to post  login

Message-ID:  

I have never let my schooling interfere with my education. -- Mark Twain


rocksolid / de.comp.lang.python / konstante Lists, Dictionaries

SubjectAuthor
* konstante Lists, DictionariesMarkus Schaaf
+* Re: konstante Lists, DictionariesPeter J. Holzer
|`- Re: konstante Lists, DictionariesMarkus Schaaf
+* [Python-de] Re: konstante Lists, DictionariesStefan Schwarzer
|`- Re: [Python-de] Re: konstante Lists, DictionariesMarkus Schaaf
`* Re: konstante Lists, DictionariesStefan Ram
 +- Re: konstante Lists, DictionariesStefan Ram
 +* Re: konstante Lists, DictionariesStefan Ram
 |`- Re: konstante Lists, DictionariesStefan Ram
 `- Re: konstante Lists, DictionariesStefan Ram

1
Subject: konstante Lists, Dictionaries
From: Markus Schaaf
Newsgroups: de.comp.lang.python
Organization: A noiseless patient Spider
Date: Fri, 22 Dec 2023 19:32 UTC
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: msch...@elaboris.de (Markus Schaaf)
Newsgroups: de.comp.lang.python
Subject: konstante Lists, Dictionaries
Date: Fri, 22 Dec 2023 20:32:37 +0100
Organization: A noiseless patient Spider
Lines: 10
Message-ID: <um4o8m$1mbqm$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 22 Dec 2023 19:32:38 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="7ee2fd1ea87adcab0f9251996ce03e85";
logging-data="1781590"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+9YLGHF8PyC9EO23qKOY2I"
User-Agent: Mozilla Thunderbird
Content-Language: en-US, de-DE
View all headers

Hallo,

habe heute ewig nach einem "unmöglichen" Fehler gesucht, weil ich
nicht gemerkt hatte, dass ein Dictionary von verschiedenen
Coroutinen modifiziert wird. In typisierten Sprachen würde man
der Coroutine eine konstante Referenz übergeben. Gibt's in Python
Methoden, sich vor solchen Fehlern zu schützen, ohne eine tiefe
Kopie anzulegen? (Oder vielleicht ist das gar nicht so schlimm?)

MfG

Subject: Re: konstante Lists, Dictionaries
From: Peter J. Holzer
Newsgroups: de.comp.lang.python
Organization: LUGA
Date: Fri, 22 Dec 2023 20:01 UTC
References: 1
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!newsreader4.netcologne.de!news.netcologne.de!tahina.priv.at!news.luga.at!.POSTED.83.218.180.76!not-for-mail
From: hjp-usen...@hjp.at (Peter J. Holzer)
Newsgroups: de.comp.lang.python
Subject: Re: konstante Lists, Dictionaries
Date: Fri, 22 Dec 2023 21:01:18 +0100
Organization: LUGA
Message-ID: <slrnuobqoe.1m18.hjp-usenet4@trintignant.hjp.at>
References: <um4o8m$1mbqm$1@dont-email.me>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Injection-Info: vinge.luga.at; posting-host="83.218.180.76";
logging-data="7378"; mail-complaints-to="usenet@vinge.luga.at"
User-Agent: slrn/1.0.3 (Linux)
Cancel-Lock: sha1:2ZUh5Z46kJoJACRUHCB7e1KK2Rc=
View all headers

On 2023-12-22 19:32, Markus Schaaf <mschaaf@elaboris.de> wrote:
> habe heute ewig nach einem "unmöglichen" Fehler gesucht, weil ich
> nicht gemerkt hatte, dass ein Dictionary von verschiedenen
> Coroutinen modifiziert wird. In typisierten Sprachen würde man
> der Coroutine eine konstante Referenz übergeben.

"In typisierten Sprachen" scheint mir unzulässig allgemein zu sein.
Wirlich in allen typisierten Sprachen? Und was ist überhaupt eine
"konstante Referenz"? Immutable soll ja wohl nicht die Referenz sein,
sondern das, worauf die Referenz zeigt.

> Gibt's in Python Methoden, sich vor solchen Fehlern zu schützen, ohne
> eine tiefe Kopie anzulegen? (Oder vielleicht ist das gar nicht so
> schlimm?)

Speziell für dict gibt es einen PEP für frozendict und offenbar auch
eine Referenzimplementation auf PyPI.

Wenn Dein Objekt nicht allgemein immutable sein soll, sondern nur für
manche Routinen, könntest Du denen ein Proxy-Objekt übergeben, das nur
lesende Zugriffe auf das Originalobjekt durchreicht (Hmm, das müsste man
eigentlich ziemlich generisch schreiben können),

hp

Subject: [Python-de] Re: konstante Lists, Dictionaries
From: Stefan Schwarzer
Newsgroups: de.comp.lang.python
Date: Fri, 22 Dec 2023 20:25 UTC
References: 1
Path: i2pn2.org!i2pn.org!paganini.bofh.team!2.eu.feeder.erje.net!feeder.erje.net!fu-berlin.de!uni-berlin.de!not-for-mail
From: sschwar...@sschwarzer.net (Stefan Schwarzer)
Newsgroups: de.comp.lang.python
Subject: [Python-de]_Re:_konstante_Lists,_Dictionaries
Date: Fri, 22 Dec 2023 21:25:57 +0100
Lines: 69
Message-ID: <bb739d87-abd5-46d6-bc99-b2296a552cbb@sschwarzer.net>
References: <um4o8m$1mbqm$1@dont-email.me>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: news.uni-berlin.de /lnsUtlcwkmeZy12EqePZgYUefLEc96MHYFWCaoU5oYA==
Cancel-Lock: sha1:jO4KAFCtz+vJTMIQD1uCQVYCoDI= sha256:ZjWxrMAKKYWLgBun3/Her8xrtKmbcmCw4uvLf2LF1ak=
Authentication-Results: mail.python.org; dkim=none reason="no signature";
dkim-adsp=none (unprotected policy); dkim-atps=neutral
User-Agent: Mozilla Thunderbird
Content-Language: en-US, de-DE
In-Reply-To: <um4o8m$1mbqm$1@dont-email.me>
X-Provags-ID: V03:K1:S1Eo0VRSgIHEi3GUj2eIBLllJb+Yq5gCsXkzfTUMjrKbSGNzdOH
3jgsV1mxXVwVIeq0u6/1ECdosQluJDVQMTWFaE4k81N7w/A+CiiEvB/uf4aqj9bjZykbM46
ri8n5UkRETybum4MixFvoKIE39RQxPYHbHKq97umKY5j+wBRKriGMMiSPjWLIO09AtMV6Fz
oxqrYOFLeigX6KM0XYQfw==
X-Spam-Flag: NO
UI-OutboundReport: notjunk:1;M01:P0:TexDTrdOpFg=;fYx/k1R1pIP2KnghKLWadHENj6g
I7hXTE8fEpTOSJ8L89wlI3xhIHSQNt//1Y2k3BMHXKvlwo4LasNIVuRbOqKTrBERFCB78c9by
1zhDldWVlMHCQ/M8DFWZoJo5vuoijjnCPIdP7+KLWIw8rr6GwMr+SM7aEocR4BGcxNzEQGi4s
oK7qQCkjNPrUdXV4WpxEaiDBX13DRdmIqrDL25yAV6BXatF8q7p0ytomy+0pgtMLj0aaWR7EM
Kbfda+dc9plarHHUScRhNb5DYbOQWL+sOQgyzqd5CGQdz+qkooq+JT/8Lcz/hg3q+f53uxDfE
GFNqhcosyqTlNc30QdmJWIHahxY700zVlskenK2Nx/oHd6fvGb/4w/mP5ms/pEfYCEhL1+SDm
HzXCU1KN002wny18g/LVa5UF7Sv11pXXX9794fDtm/Yuyy7v+vO8clE/juPqIU2fBqy7MP5kR
roXAilBRclCcfacJRr0psHBLA6OmP2tUsiu5+hBCxkOQOljR5VWgdhNHhJChCRBXX4TvQLCPY
ZpwMXxuPucG7l/F+c9QiqeJiADA5ifWisTcA4+IeT9eay6glVq8upZ+4Nn1hx/+78waewRQPA
F5/Iz+ySM5I3LBklD0a7Q/EoL42o96R+dB4Y+aATCVM4McU6YUsdbZ+MkrUl8YJ7yxqjhFLL1
b+LCLDFltEMHazgIIqRNiHfNCSMwnGSU8AZXMWRrZReJ9WACxIl8DUl/2s+s83tgxunxu/7+s
rK5e6VmHzl+5/aGWcS0hl5JsXDgrd/IXnFnechJuqzIfoCtZrBA4Xm465lYuyaUimfgN2Zrmq
ejqRFhnaOD3mi71DM7/wdO5E9ly3wIa0oKRxBqHGH4tGx0wFFlHGesK+2ETegVmoOh3DK1kZp
xhCkbgIV29revcw==
Message-ID-Hash: QSOATKNVS65NVWQGXWO55BCG576FCKAB
X-Message-ID-Hash: QSOATKNVS65NVWQGXWO55BCG576FCKAB
X-MailFrom: sschwarzer@sschwarzer.net
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-python-de.python.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.10b1
Precedence: list
List-Id: Die Deutsche Python Mailingliste <python-de.python.org>
Archived-At: <https://mail.python.org/archives/list/python-de@python.org/message/QSOATKNVS65NVWQGXWO55BCG576FCKAB/>
List-Archive: <https://mail.python.org/archives/list/python-de@python.org/>
List-Help: <mailto:python-de-request@python.org?subject=help>
List-Owner: <mailto:python-de-owner@python.org>
List-Post: <mailto:python-de@python.org>
List-Subscribe: <mailto:python-de-join@python.org>
List-Unsubscribe: <mailto:python-de-leave@python.org>
View all headers

On 2023-12-22 20:32, Markus Schaaf wrote:
> habe heute ewig nach einem "unmöglichen" Fehler gesucht, weil ich
> nicht gemerkt hatte, dass ein Dictionary von verschiedenen
> Coroutinen modifiziert wird.

Vor sowas schützt Python in der Tat schlecht.

> In typisierten Sprachen würde man
> der Coroutine eine konstante Referenz übergeben.

Python ist auch "typisiert", aber das Typ-System gibt es nicht
her, Änderungen zu kontrollieren. ;-)

> Gibt's in Python
> Methoden, sich vor solchen Fehlern zu schützen, ohne eine tiefe
> Kopie anzulegen? (Oder vielleicht ist das gar nicht so schlimm?)

Ein paar bunt gemischte spontane Gedanken dazu ... :-)

- Ob tiefe Kopien ein Problem für dein Programm und die darin
verarbeiteten Daten sind, musst du ausprobieren. Bei nicht zu
riesigen Datenmengen und häufigen Kopien kann es gutgehen.

- Versuch, im Design die Konstellation, dass ein Objekt von
verschiedenen Stellen geändert wird, von vornherein möglichst
zu vermeiden. Ok, das ist zugegebenermaßen sehr schwammig und
es hängt von deinem Programm ab, ob sich das gut umsetzen
lässt.

- Ich versuche, in-place-Änderungen möglichst zu vermeiden und
stattdessen modifizierte Objekte zurückzugeben. Sowas ist eher
in der Funktionalen Programmierung üblich, klappt aber auch oft
in Python einigermaßen erträglich. Je nachdem, was du für Daten
hast und wie dein Programmfluss ist, kann das aber auch darauf
hinauslaufen, dass du viele tiefe Kopien erzeugst, was ein
Problem sein _kann_ (siehe oben).

- Recherchiere zu sogenannten persistenten Datenstrukturen. Die
funktionieren so, dass bei einer Änderung ein neues Objekt mit
den Änderungen erzeugt wird und das ursprüngliche Objekt
unverändert bleibt. Anders als bei Python-Listen oder
-Dictionaries hängt die Zeit für ein solches "funktionales
Update" nicht (wesentlich) von der Größe der Datenstruktur ab.

Ich habe bei einer Suche zum Beispiel
https://github.com/tobgu/pyrsistent gefunden, kann aber nicht
einschätzen, inwieweit das in dein Design passt. Im
Zweifelsfall würde ich erst mal versuchen, das Problem mit
"Python-Standard-Designs" zu lösen.

In dem Zusammenhang würde mich interessieren, wer von euch
Erfahrungen mit solchen Datenstrukturen/Bibliotheken in Python
hat und wie gut das für euch funktioniert hat.

- Python hat, anders als zum Beispiel Rust, kein explizites
Ownership-System, aber du kannst dir trotzdem beim Designen
überlegen, welches Objekt der Owner eines bestimmten Objekts
sein soll.

Ich denke, um konkretere Ratschläge zu bekommen, müsstest du
deinen Code zeigen beziehungsweise die "konkurrierenden"
Code-Teile genauer beschreiben.

Davon abgesehen interessiert mich, wie andere Entwickler:innen
mit dieser Problematik umgehen. Was habt ihr für Ansätze
ausprobiert und was waren eure Erfahrungen?

Viele Grüße
Stefan

Subject: Re: konstante Lists, Dictionaries
From: Markus Schaaf
Newsgroups: de.comp.lang.python
Organization: A noiseless patient Spider
Date: Fri, 22 Dec 2023 21:31 UTC
References: 1 2
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: msch...@elaboris.de (Markus Schaaf)
Newsgroups: de.comp.lang.python
Subject: Re: konstante Lists, Dictionaries
Date: Fri, 22 Dec 2023 22:31:40 +0100
Organization: A noiseless patient Spider
Lines: 12
Message-ID: <um4v7u$1neia$1@dont-email.me>
References: <um4o8m$1mbqm$1@dont-email.me>
<slrnuobqoe.1m18.hjp-usenet4@trintignant.hjp.at>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 22 Dec 2023 21:31:42 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="7ee2fd1ea87adcab0f9251996ce03e85";
logging-data="1817162"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+ZNrSGCTr1XycinZ+FpAJr"
User-Agent: Mozilla Thunderbird
Content-Language: de-DE, en-US, de-AT
In-Reply-To: <slrnuobqoe.1m18.hjp-usenet4@trintignant.hjp.at>
View all headers

Am 22.12.23 um 21:01 schrieb Peter J. Holzer:

> Speziell für dict gibt es einen PEP für frozendict und offenbar auch
> eine Referenzimplementation auf PyPI.
>
> Wenn Dein Objekt nicht allgemein immutable sein soll, sondern nur für
> manche Routinen, könntest Du denen ein Proxy-Objekt übergeben, das nur
> lesende Zugriffe auf das Originalobjekt durchreicht (Hmm, das müsste man
> eigentlich ziemlich generisch schreiben können),

Danke. Sind beides gute Hinweise.

Subject: Re: konstante Lists, Dictionaries
From: Stefan Ram
Newsgroups: de.comp.lang.python
Organization: Stefan Ram
Date: Fri, 22 Dec 2023 21:37 UTC
References: 1
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!fu-berlin.de!uni-berlin.de!not-for-mail
From: ram...@zedat.fu-berlin.de (Stefan Ram)
Newsgroups: de.comp.lang.python
Subject: Re: konstante Lists, Dictionaries
Date: 22 Dec 2023 21:37:55 GMT
Organization: Stefan Ram
Lines: 46
Expires: 1 Dec 2024 11:59:58 GMT
Message-ID: <setitem-20231222223630@ram.dialup.fu-berlin.de>
References: <um4o8m$1mbqm$1@dont-email.me>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Trace: news.uni-berlin.de WuLc/XgvmnKiZiasF6QK7gjagxk9Cnz1f7V5RyyOwuGk5p
Cancel-Lock: sha1:1KwCoJHebafR6fP3I2P+QbzR/9o= sha256:RGD5pOL4H91IdGNh+PbNau1aFBS7K6rW974leFCBo5M=
X-Copyright: (C) Copyright 2023 Stefan Ram. All rights reserved.
Distribution through any means other than regular usenet
channels is forbidden. It is forbidden to publish this
article in the Web, to change URIs of this article into links,
and to transfer the body without this notice, but quotations
of parts in other Usenet posts are allowed.
X-No-Archive: Yes
Archive: no
X-No-Archive-Readme: "X-No-Archive" is set, because this prevents some
services to mirror the article in the web. But the article may
be kept on a Usenet archive server with only NNTP access.
X-No-Html: yes
Content-Language: de-DE-1901
Accept-Language: de-DE-1901, en-US, it, fr-FR
View all headers

Markus Schaaf <mschaaf@elaboris.de> writes:
>nicht gemerkt hatte, dass ein Dictionary von verschiedenen
>Coroutinen modifiziert wird. In typisierten Sprachen würde man
>der Coroutine eine konstante Referenz übergeben. Gibt's in Python
>Methoden, sich vor solchen Fehlern zu schützen, ohne eine tiefe
>Kopie anzulegen? (Oder vielleicht ist das gar nicht so schlimm?)

Das folgende Program zeigt, wie man in Python ein "konstantes
Wörterbuch" c definieren könnte, das die Daten mit einem
nicht-konstanten Wörterbuch d teilt. Es ist aber nur als eine
Ideenskizze zu verstehen. Vor einem etwaigen Einsatz in der
Praxis sind je nach Bedarf vermutlich Anpassungen vorzunehmen.
(Für Listen sollte das auch ähnlich gehen.)

main.py

import collections

class dictionary( collections.UserDict ):
pass

class const_dict( dictionary ):
def __init__( self, other ):
self.data = other.data
def __setitem__( self, key, item ):
raise NotImplementedError

d = dictionary()
d[ 1 ]= 2
print( d )
c = const_dict( d )
print( c )
c[ 2 ]= 3

stdout

{1: 2}
{1: 2}
Traceback (most recent call last):
File "main.py", line 17, in <module>
c[ 2 ]= 3
File "main.py", line 10, in __setitem__
raise NotImplementedError
NotImplementedError

Subject: Re: [Python-de] Re: konstante Lists, Dictionaries
From: Markus Schaaf
Newsgroups: de.comp.lang.python
Organization: A noiseless patient Spider
Date: Fri, 22 Dec 2023 21:47 UTC
References: 1 2
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: msch...@elaboris.de (Markus Schaaf)
Newsgroups: de.comp.lang.python
Subject: Re: [Python-de] Re: konstante Lists, Dictionaries
Date: Fri, 22 Dec 2023 22:47:01 +0100
Organization: A noiseless patient Spider
Lines: 29
Message-ID: <um504n$1neia$2@dont-email.me>
References: <um4o8m$1mbqm$1@dont-email.me>
<bb739d87-abd5-46d6-bc99-b2296a552cbb@sschwarzer.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 22 Dec 2023 21:47:03 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="7ee2fd1ea87adcab0f9251996ce03e85";
logging-data="1817162"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+NYukoAFvScxP2YyrFd2ux"
User-Agent: Mozilla Thunderbird
Content-Language: de-DE, en-US, de-AT
In-Reply-To: <bb739d87-abd5-46d6-bc99-b2296a552cbb@sschwarzer.net>
View all headers

Am 22.12.23 um 21:25 schrieb Stefan Schwarzer:

> - Versuch, im Design die Konstellation, dass ein Objekt von
> verschiedenen Stellen geändert wird, von vornherein möglichst
> zu vermeiden. Ok, das ist zugegebenermaßen sehr schwammig und
> es hängt von deinem Programm ab, ob sich das gut umsetzen
> lässt.

Das mache ich ja. Ich nutze sonst viel C++. Und da ist es
beliebt, sich "kleine" Fehler vom Compiler melden zu lassen. Das
ist kein Fetisch, sondern die Einsicht, dass Menschen dumme
kleine Fehler machen.

> - Ich versuche, in-place-Änderungen möglichst zu vermeiden und
> stattdessen modifizierte Objekte zurückzugeben.

Das scheint mir die richtige Vorgehensweise für Python zu sein.

> Ich denke, um konkretere Ratschläge zu bekommen, müsstest du
> deinen Code zeigen beziehungsweise die "konkurrierenden"
> Code-Teile genauer beschreiben.

Es gibt da kein existentielles Problem. Ich habe den Algorithmus
einfach so geändert, dass ich das "globale" Dictionary nicht
modifiziere. Das Problem ist dadurch entstanden, dass ich
Änderungen an einer Coroutine vorgenommen habe, ohne zu erkennen,
dass ein Funktionsparameter geteilt wird. Sah ja lokal aus.

MfG

Subject: Re: konstante Lists, Dictionaries
From: Stefan Ram
Newsgroups: de.comp.lang.python
Organization: Stefan Ram
Date: Sat, 23 Dec 2023 10:16 UTC
References: 1 2
Path: i2pn2.org!i2pn.org!news.swapon.de!fu-berlin.de!uni-berlin.de!not-for-mail
From: ram...@zedat.fu-berlin.de (Stefan Ram)
Newsgroups: de.comp.lang.python
Subject: Re: konstante Lists, Dictionaries
Date: 23 Dec 2023 10:16:35 GMT
Organization: Stefan Ram
Lines: 12
Expires: 1 Dec 2024 11:59:58 GMT
Message-ID: <Klasse-20231223111545@ram.dialup.fu-berlin.de>
References: <um4o8m$1mbqm$1@dont-email.me> <setitem-20231222223630@ram.dialup.fu-berlin.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Trace: news.uni-berlin.de BZYCe5ryiiZzBkCT6tEzgwJP9GnrCvcXNGzMZTEdhitqbH
Cancel-Lock: sha1:jqtrXrU28RIQPyJ5EuIvx66JHGc= sha256:Lf+mg2W2djBxtmlcx63UdWvMcc8IVAWLCSsHyQfQJqs=
X-Copyright: (C) Copyright 2023 Stefan Ram. All rights reserved.
Distribution through any means other than regular usenet
channels is forbidden. It is forbidden to publish this
article in the Web, to change URIs of this article into links,
and to transfer the body without this notice, but quotations
of parts in other Usenet posts are allowed.
X-No-Archive: Yes
Archive: no
X-No-Archive-Readme: "X-No-Archive" is set, because this prevents some
services to mirror the article in the web. But the article may
be kept on a Usenet archive server with only NNTP access.
X-No-Html: yes
Content-Language: de-DE-1901
Accept-Language: de-DE-1901, en-US, it, fr-FR
View all headers

ram@zedat.fu-berlin.de (Stefan Ram) writes:
>class dictionary( collections.UserDict ):

Oben habe ich versehentlich gegen eine Empfehlung aus PEP 8
verstoßen.

|Class names should normally use the CapWords convention.
PEP 8

Ich hätte die Klasse also "Dictionary" (usw.) nennen sollen!

Subject: Re: konstante Lists, Dictionaries
From: Stefan Ram
Newsgroups: de.comp.lang.python
Organization: Stefan Ram
Date: Wed, 27 Dec 2023 09:04 UTC
References: 1 2
Path: i2pn2.org!i2pn.org!paganini.bofh.team!2.eu.feeder.erje.net!feeder.erje.net!fu-berlin.de!uni-berlin.de!not-for-mail
From: ram...@zedat.fu-berlin.de (Stefan Ram)
Newsgroups: de.comp.lang.python
Subject: Re: konstante Lists, Dictionaries
Date: 27 Dec 2023 09:04:39 GMT
Organization: Stefan Ram
Lines: 19
Expires: 1 Dec 2024 11:59:58 GMT
Message-ID: <mutable-20231227100309@ram.dialup.fu-berlin.de>
References: <um4o8m$1mbqm$1@dont-email.me> <setitem-20231222223630@ram.dialup.fu-berlin.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Trace: news.uni-berlin.de Ih8LZBGtjK/LM2ByzRAh5gHir7VxJf1b2IIeymGIOJlBQd
Cancel-Lock: sha1:AitG1obOCpE+KZVxjkVXdZFbd38= sha256:fhltG2HVrHemsfWPWdobj6DfoOA+1BqIMYsmcbS/GaQ=
X-Copyright: (C) Copyright 2023 Stefan Ram. All rights reserved.
Distribution through any means other than regular usenet
channels is forbidden. It is forbidden to publish this
article in the Web, to change URIs of this article into links,
and to transfer the body without this notice, but quotations
of parts in other Usenet posts are allowed.
X-No-Archive: Yes
Archive: no
X-No-Archive-Readme: "X-No-Archive" is set, because this prevents some
services to mirror the article in the web. But the article may
be kept on a Usenet archive server with only NNTP access.
X-No-Html: yes
Content-Language: de-DE-1901
Accept-Language: de-DE-1901, en-US, it, fr-FR
View all headers

ram@zedat.fu-berlin.de (Stefan Ram) writes:
>import collections
>class dictionary( collections.UserDict ):
> pass
>class const_dict( dictionary ):
> def __init__( self, other ):
> self.data = other.data
> def __setitem__( self, key, item ):
> raise NotImplementedError

Allerdings wäre danach

issubclass( const_dict, collections.abc.MutableMapping )

wahr (/Mutable/!). Dies mag in der hier beschriebenen Anwendung
kein Problem sein; aber um dies zu verhindern, könnte man
"const_dict" auf collections.abc.Mapping bauen.

Subject: Re: konstante Lists, Dictionaries
From: Stefan Ram
Newsgroups: de.comp.lang.python
Organization: Stefan Ram
Date: Wed, 10 Apr 2024 13:35 UTC
References: 1 2
Path: i2pn2.org!i2pn.org!news.swapon.de!fu-berlin.de!uni-berlin.de!not-for-mail
From: ram...@zedat.fu-berlin.de (Stefan Ram)
Newsgroups: de.comp.lang.python
Subject: Re: konstante Lists, Dictionaries
Date: 10 Apr 2024 13:35:20 GMT
Organization: Stefan Ram
Lines: 11
Expires: 1 Feb 2025 11:59:58 GMT
Message-ID: <__setattr__-20240410143446@ram.dialup.fu-berlin.de>
References: <um4o8m$1mbqm$1@dont-email.me> <setitem-20231222223630@ram.dialup.fu-berlin.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Trace: news.uni-berlin.de aJc2wRssBClkKPBClLHiHws25tnEXJlzXI+1+3Xtz3+jJ/
Cancel-Lock: sha1:R2HsoJck+fzgsuGuMn041PcOwW4= sha256:vJy1hBjrmNvft8C0SF+eI5c0LYX9lArcX7NY6rSRup0=
X-Copyright: (C) Copyright 2024 Stefan Ram. All rights reserved.
Distribution through any means other than regular usenet
channels is forbidden. It is forbidden to publish this
article in the Web, to change URIs of this article into links,
and to transfer the body without this notice, but quotations
of parts in other Usenet posts are allowed.
X-No-Archive: Yes
Archive: no
X-No-Archive-Readme: "X-No-Archive" is set, because this prevents some
services to mirror the article in the web. But the article may
be kept on a Usenet archive server with only NNTP access.
X-No-Html: yes
Content-Language: de-DE-1901
View all headers

ram@zedat.fu-berlin.de (Stefan Ram) schrieb oder zitierte:
>Das folgende Program zeigt, wie man in Python ein "konstantes
>Wörterbuch" c definieren könnte, das die Daten mit einem
....
>def __setitem__( self, key, item ):
> raise NotImplementedError

Man nennt solche Objekte in Python auch "frozen".

Verwendet man bei einer dataclass "frozen=True" so erhält man
entsprechend auch eine "__setattr__"-Methode mit einem "raise".

Subject: Re: konstante Lists, Dictionaries
From: Stefan Ram
Newsgroups: de.comp.lang.python
Organization: Stefan Ram
Date: Sun, 28 Apr 2024 17:58 UTC
References: 1 2 3
Path: i2pn2.org!i2pn.org!usenet.goja.nl.eu.org!3.eu.feeder.erje.net!feeder.erje.net!fu-berlin.de!uni-berlin.de!not-for-mail
From: ram...@zedat.fu-berlin.de (Stefan Ram)
Newsgroups: de.comp.lang.python
Subject: Re: konstante Lists, Dictionaries
Date: 28 Apr 2024 17:58:05 GMT
Organization: Stefan Ram
Lines: 55
Expires: 1 Feb 2025 11:59:58 GMT
Message-ID: <Korrektur-20240428185655@ram.dialup.fu-berlin.de>
References: <um4o8m$1mbqm$1@dont-email.me> <setitem-20231222223630@ram.dialup.fu-berlin.de> <mutable-20231227100309@ram.dialup.fu-berlin.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Trace: news.uni-berlin.de paQvwIu4JwNLUPvPbWUPlwN9YVhWqS68X/qgwBp1Dcygjs
Cancel-Lock: sha1:95BzMVI6krnF6e4Jop8IQpoJa50= sha256:IFKcsJ/yPrsVCkvs73drJ97KjGqxjj2x9W5xs5b/TyQ=
X-Copyright: (C) Copyright 2024 Stefan Ram. All rights reserved.
Distribution through any means other than regular usenet
channels is forbidden. It is forbidden to publish this
article in the Web, to change URIs of this article into links,
and to transfer the body without this notice, but quotations
of parts in other Usenet posts are allowed.
X-No-Archive: Yes
Archive: no
X-No-Archive-Readme: "X-No-Archive" is set, because this prevents some
services to mirror the article in the web. But the article may
be kept on a Usenet archive server with only NNTP access.
X-No-Html: yes
Content-Language: de-DE-1901
View all headers

ram@zedat.fu-berlin.de (Stefan Ram) schrieb oder zitierte:
>Allerdings wäre danach
>issubclass( const_dict, collections.abc.MutableMapping )
>wahr (/Mutable/!). Dies mag in der hier beschriebenen Anwendung
>kein Problem sein; aber um dies zu verhindern, könnte man
>"const_dict" auf collections.abc.Mapping bauen.

Hier nun eine korrigierte Version:

import collections.abc

class ImmutableMap( collections.abc.Mapping ):

def __init__( self, *args, **kwargs ):
self._data = dict( *args, **kwargs )

def __len__( self ):
return len( self._data )

def __getitem__( self, key ):
return self._data[ key ]

def __iter__( self ):
return iter( self._data )

def __contains__( self, key ):
return key in self._data

def get( self, key, default=None ):
return self._data.get( key, default )

def __str__( self ):
return str( self._data )

print( issubclass( ImmutableMap, collections.abc.MutableMapping ))
print( issubclass( ImmutableMap, collections.abc.Mapping ))

d = dict()
d[ 1 ]= 2
print( d )

c = ImmutableMap( d )
print( c )
c[ 2 ]= 3

Ausgabe:

False
True
{1: 2}
{1: 2}
Traceback (most recent call last):
File "Main.py", line 35, in <module>
c[ 2 ]= 3
TypeError: 'ImmutableMap' object does not support item assignment


rocksolid / de.comp.lang.python / konstante Lists, Dictionaries

1
server_pubkey.txt

rocksolid light 0.9.12
clearnet tor