Subrayar en Python

Recientemente tuve la oportunidad de escuchar una charla sobre buenas y malas pr谩cticas de programaci贸n en C. En 茅l, en particular, se toc贸 el tema de decodificar c贸digo de programa de aspecto divertido ( emoticones en C). Luego hubo un debate sobre la conveniencia de usar un c贸digo tan confuso para probar las habilidades de un candidato para un puesto de programador durante las entrevistas. La disputa no condujo a un consenso.

Considere una posible pregunta sobre emoticones durante una entrevista para un puesto que implique el conocimiento del lenguaje de programaci贸n Python.

Desaf铆o


Hay dos expresiones:

  1. _+_ 
  2.  _|_ 

驴Cu谩l de estas dos expresiones probablemente conducir谩 a errores y por qu茅?

Notas de expresi贸n
Cabe se帽alar que estas expresiones no se leen bien, por lo que no es aconsejable usarlas en el c贸digo de trabajo, pero solo se pueden usar como un rompecabezas.
Tambi茅n debe recordar que los emoticones en la tarea no est谩n escritos pit贸nicamente (no cumplen con el est谩ndar de estilo PEP 8 ).

Soluci贸n


En Python, el gui贸n bajo no es una palabra clave ; por lo tanto, en general, se puede usar para asignar ciertos valores a las variables.

La tarea se reduce a la consideraci贸n de casos de errores durante la adici贸n y con "bit a bit" o (por brevedad, simplemente "o") una variable. Es decir para buscar los tipos integrados de Python (clases) para los que se implementa una operaci贸n y para buscar los tipos integrados donde se implementa otra operaci贸n.

En la consola de Python, es f谩cil verificar que haya valores de subrayado tales como:

  1. No hay error al evaluar cada expresi贸n
     >>> _ = 10 >>> _+_ 20 >>> _ = 10 >>> _|_ 10 
  2. No hay error al evaluar la primera expresi贸n
     >>> _ = '10' >>> _+_ '1010' >>> _ = '10' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'str' and 'str' 
  3. No hay error al calcular la segunda expresi贸n
     >>> _ = {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. Hay un error en el c谩lculo de cada expresi贸n.
     >>> _ = {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' 

La magia de Python es que la implementaci贸n de adiciones, y "o", y otros operadores est谩 en los llamados "m茅todos m谩gicos" descritos para las clases requeridas.
Adem谩s, este es el m茅todo

 __add__ 

Para "o", este es un m茅todo

 __or__ 

El nombre de cada m茅todo m谩gico contiene guiones bajos, dos al principio y al final de la palabra correspondiente.

Encontrar informaci贸n sobre las clases integradas de Python.
Puede intentar encontrar la informaci贸n requerida en la documentaci贸n de los tipos integrados en el sitio web oficial de Python: https://docs.python.org/3.7/library/stdtypes.html .
Puedes ejecutar en una terminal Python

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

Prefiero usar la documentaci贸n de la versi贸n exacta de Python que estoy usando actualmente, refiri茅ndome a la interfaz web del m贸dulo pydoc.

Para hacer esto, en el s铆mbolo del sistema, ingrese, por ejemplo:

 python3 -m pydoc -p 3344 

y abra el m贸dulo de documentaci贸n del navegador http: // localhost: 3344 / builtins.html .

Clases integradas para las cuales se implementan nuestros m茅todos:
__add____o__
boolbool
bytearrayconjunto congelado
bytesint
complejoestablecer
flotar
int
lista
str
tupla

Nueve clases integradas implementan la operaci贸n de suma y cuatro implementan "o".
Adem谩s, puede tratar de especular sobre la frecuencia del uso de clases base en proyectos reales, sobre clases no b谩sicas y la implementaci贸n de los m茅todos anteriores para ellos. Es probable que esto se aprecie positivamente durante la entrevista.

Respuesta 1.
La segunda expresi贸n a menudo conducir谩 a un error.



Posibles preguntas adicionales sobre subrayar entrevista


驴Cu谩l es el papel del gui贸n bajo en nombrar objetos?


Respuesta 2.
El gui贸n bajo se puede usar para separar palabras en diferentes estilos de nombres de entidades en Python :

  1. Al nombrar en min煤sculas

     lower_case_with_underscores 
  2. Al nombrar en may煤sculas

     UPPER_CASE_WITH_UNDERSCORES 

Algunos nombres limitados a guiones bajos est谩n reservados :

  1. Con un gui贸n bajo al comienzo de un nombre, no se importa durante la importaci贸n general

     from module import * 
  2. Con dos guiones bajos en ambos lados del nombre se considera sist茅mico, no se recomienda utilizar dichos nombres para otros fines.
  3. Con dos guiones bajos al comienzo de un nombre, se considera privado (no p煤blico) para la clase


驴Cu谩l es el papel de un solo gui贸n bajo?


Respuesta 3.
En el int茅rprete, si el gui贸n bajo no se us贸 expl铆citamente como una variable, almacena el resultado de la 煤ltima acci贸n sin errores que se muestra en la pantalla.

 $ 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 

Esto se debe a que sys.stdout se escapa con displayhook . Tome un ejemplo de la documentaci贸n oficial :

 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 

Adem谩s, un solo subrayado se usa com煤nmente para la conveniencia de la internalizaci贸n .

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


All Articles