Dies soll keine direkte Antwort auf die Frage des Auftraggebers sein, aber ich wollte einige damit zusammenhängende Ideen mitteilen.
Ich war sehr an der obigen Antwort von @steveha interessiert, die ein Beispiel zu geben schien, bei dem die Duck-Typisierung zu brechen scheint. Bei näherem Nachdenken deutet sein Beispiel jedoch darauf hin, dass die Duck-Typisierung schwer einzuhalten ist, aber sie tut es no legen nahe, dass str
eine besondere Behandlung verdient.
Schließlich ist ein Nicht str
Typ (z. B. ein benutzerdefinierter Typ, der einige komplizierte rekursive Strukturen enthält) kann dazu führen, dass @steveha srepr
Funktion eine unendliche Rekursion auslösen. Obwohl dies zugegebenermaßen eher unwahrscheinlich ist, können wir diese Möglichkeit nicht ignorieren. Daher sollten wir statt der Sonderkodierung str
in srepr
sollten wir klären, was wir wollen srepr
was zu tun ist, wenn sich eine unendliche Rekursion ergibt.
Ein vernünftiger Ansatz könnte darin bestehen, die Rekursion einfach in srepr
der Moment list(arg) == [arg]
. Dies würde das Problem mit den folgenden Punkten vollständig lösen str
, ohne jegliche isinstance
.
Eine wirklich komplizierte rekursive Struktur kann jedoch zu einer Endlosschleife führen, in der list(arg) == [arg]
passiert nie. Daher ist die obige Prüfung zwar nützlich, aber nicht ausreichend. Wir brauchen so etwas wie eine harte Grenze für die Rekursionstiefe.
Mein Punkt ist, dass wenn Sie planen, beliebige Argumenttypen zu behandeln, die Behandlung str
via duck typing ist viel, viel einfacher als der Umgang mit den allgemeineren Typen, denen man (theoretisch) begegnen kann. Wenn Sie also das Bedürfnis haben, folgende Typen auszuschließen str
Instanzen, sollten Sie stattdessen verlangen, dass das Argument eine Instanz eines der wenigen Typen ist, die Sie ausdrücklich angeben.