Unterstreichen Sie in Python

Ich hatte kürzlich die Gelegenheit, einen Vortrag über gute und schlechte C-Programmierpraktiken zu hören. Dabei wurde insbesondere das Thema der Dekodierung von lustig aussehendem Programmcode ( Emoticons in C) angesprochen. Dann gab es eine Debatte über die Angemessenheit der Verwendung eines derart verwirrenden Codes, um die Fähigkeiten eines Kandidaten für eine Programmiererposition während der Interviews zu testen. Der Streit führte nicht zu einem Konsens.

Betrachten Sie eine mögliche Frage zu Emoticons während eines Interviews für eine Position, die Kenntnisse der Programmiersprache Python impliziert.

Herausforderung


Es gibt zwei Ausdrücke:

  1. _+_ 
  2.  _|_ 

Welcher dieser beiden Ausdrücke führt mit größerer Wahrscheinlichkeit zu Fehlern und warum?

Ausdrucksnotizen
Es sollte beachtet werden, dass diese Ausdrücke schlecht gelesen werden. Solche Ausdrücke sollten nicht im Arbeitscode verwendet werden, sondern können nur als Puzzle verwendet werden.
Sie müssen sich auch daran erinnern, dass die Emoticons in der Aufgabe nicht pythonisch geschrieben sind (entsprechen nicht dem PEP 8- Stilstandard ).

Lösung


In Python ist der Unterstrich kein Schlüsselwort , daher kann er im Allgemeinen verwendet werden, um Variablen bestimmte Werte zuzuweisen.

Die Aufgabe reduziert sich auf die Berücksichtigung von Fehlerfällen während des Hinzufügens und mit "bitweise oder" (der Kürze halber einfach "oder") einer Variablen. Das heißt, Suchen nach in Python integrierten Typen (Klassen), für die eine Operation implementiert ist, und Suchen nach integrierten Typen, in denen eine andere Operation implementiert ist.

In der Python-Konsole kann leicht überprüft werden, ob Unterstrichwerte vorhanden sind, z.

  1. Es gibt keinen Fehler bei der Auswertung jedes Ausdrucks
     >>> _ = 10 >>> _+_ 20 >>> _ = 10 >>> _|_ 10 
  2. Es gibt keinen Fehler bei der Auswertung des ersten Ausdrucks
     >>> _ = '10' >>> _+_ '1010' >>> _ = '10' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'str' and 'str' 
  3. Es gibt keinen Fehler bei der Berechnung des zweiten Ausdrucks
     >>> _ = {1, 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'set' and 'set' >>> _|_ {0, 1} 
  4. Bei der Berechnung jedes Ausdrucks ist ein Fehler aufgetreten
     >>> _ = {1: 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'dict' and 'dict' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'dict' and 'dict' 

Die Magie von Python besteht darin, dass die Implementierung von Ergänzungen und "oder" und anderen Operatoren in den sogenannten "magischen Methoden" erfolgt, die für die erforderlichen Klassen beschrieben wurden.
Dies ist außerdem die Methode

 __add__ 

Für "oder" ist dies eine Methode

 __or__ 

Der Name jeder magischen Methode enthält Unterstriche, zwei am Anfang und am Ende des entsprechenden Wortes.

Informationen zu integrierten Python-Klassen finden.
Sie können versuchen, die erforderlichen Informationen in der Dokumentation für integrierte Typen auf der offiziellen Python-Website zu finden: https://docs.python.org/3.7/library/stdtypes.html .
Sie können in einem Python-Terminal ausführen

 >>> import builtins >>> help(builtins) 

Ich bevorzuge es, die Dokumentation der genauen Version von Python zu verwenden, die ich derzeit verwende, und verweise auf die Weboberfläche des pydoc-Moduls.

Geben Sie dazu an der Eingabeaufforderung beispielsweise Folgendes ein:

 python3 -m pydoc -p 3344 

und öffnen Sie das Browser-Dokumentationsmodul http: // localhost: 3344 / builtins.html .

Integrierte Klassen, für die unsere Methoden implementiert sind:
__add____oder__
BoolBool
bytearrayFrozenset
Bytesint
komplexeinstellen
float
int
Liste
str
Tupel

Neun integrierte Klassen implementieren die Additionsoperation und vier implementieren das "oder".
Darüber hinaus können Sie versuchen, über die Häufigkeit der Verwendung von Basisklassen in realen Projekten, über nicht grundlegende Klassen und die Implementierung der oben genannten Methoden für diese zu spekulieren. Dies wird während des Interviews wahrscheinlich positiv bewertet.

Antwort 1.
Der zweite Ausdruck führt häufig zu einem Fehler.



Mögliche zusätzliche Fragen zum Unterstreichen des Interviews


Welche Rolle spielt der Unterstrich bei der Benennung von Objekten?


Antwort 2.
Der Unterstrich kann verwendet werden, um Wörter in verschiedenen Entitätsnamensstilen in Python zu trennen:

  1. Bei der Benennung in Kleinbuchstaben

     lower_case_with_underscores 
  2. Bei der Benennung in Großbuchstaben

     UPPER_CASE_WITH_UNDERSCORES 

Einige auf Unterstriche beschränkte Namen sind vorbehalten :

  1. Mit einem Unterstrich am Anfang eines Namens wird dieser beim allgemeinen Import nicht importiert

     from module import * 
  2. Da zwei Unterstriche auf beiden Seiten des Namens als systemisch gelten, wird nicht empfohlen, solche Namen für andere Zwecke zu verwenden
  3. Mit zwei Unterstrichen am Anfang eines Namens wird er für die Klasse als privat (nicht öffentlich) betrachtet


Welche Rolle spielt ein einzelner Unterstrich?


Antwort 3.
Wenn der Unterstrich im Interpreter nicht explizit als Variable verwendet wurde, speichert er das Ergebnis der letzten fehlerfreien Aktion, die auf dem Bildschirm angezeigt wird.

 $ python3 Python 3.6.8 (default, Feb 14 2019, 22:09:48) [GCC 7.4.0] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> _ Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name '_' is not defined >>> 2 * 5 10 >>> _ 10 >>> _ = 1 >>> _ 1 >>> 2 * 5 10 >>> _ 1 

Dies liegt daran, dass sys.stdout mit displayhook maskiert wird . Nehmen Sie ein Beispiel aus der offiziellen Dokumentation :

 def displayhook(value): if value is None: return # Set '_' to None to avoid recursion builtins._ = None text = repr(value) try: sys.stdout.write(text) except UnicodeEncodeError: bytes = text.encode(sys.stdout.encoding, 'backslashreplace') if hasattr(sys.stdout, 'buffer'): sys.stdout.buffer.write(bytes) else: text = bytes.decode(sys.stdout.encoding, 'strict') sys.stdout.write(text) sys.stdout.write("\n") builtins._ = value 

Darüber hinaus wird zur Vereinfachung der Internalisierung üblicherweise eine einzige Unterstreichung verwendet.

Source: https://habr.com/ru/post/de459672/


All Articles