online - ¿Cómo romper una línea de métodos encadenados en Python?
python enhancement proposal no 8 pep8 (8)
De acuerdo con la referencia del lenguaje Python
Puedes usar una barra invertida.
O simplemente romperlo. Si un paréntesis no está emparejado, Python no lo tratará como una línea. Y bajo tal circunstancia, la sangría de las siguientes líneas no importa.
Tengo una línea del siguiente código (no culpo a las convenciones de nombres, no son mías):
subkeyword = Session.query(
Subkeyword.subkeyword_id, Subkeyword.subkeyword_word
).filter_by(
subkeyword_company_id=self.e_company_id
).filter_by(
subkeyword_word=subkeyword_word
).filter_by(
subkeyword_active=True
).one()
No me gusta cómo se ve (no demasiado legible) pero no tengo una mejor idea para limitar las líneas a 79 caracteres en esta situación. ¿Hay una mejor manera de romperlo (preferiblemente sin barras diagonales inversas)?
Es una solución un poco diferente de la proporcionada por otros, pero es una de mis favoritas, ya que a veces lleva a una metaprogramación ingeniosa.
base = [Subkeyword.subkeyword_id, Subkeyword_word]
search = {
''subkeyword_company_id'':self.e_company_id,
''subkeyword_word'':subkeyword_word,
''subkeyword_active'':True,
}
subkeyword = Session.query(*base).filter_by(**search).one()
Esta es una buena técnica para crear búsquedas. Revise una lista de condicionales para extraer de su formulario de consulta complejo (o deducciones basadas en cadenas sobre lo que el usuario está buscando), luego simplemente explote el diccionario en el filtro.
Este es un caso en el que se prefiere un carácter de continuación de línea para abrir paréntesis. La necesidad de este estilo se vuelve más obvia a medida que los nombres de los métodos se alargan y los métodos comienzan a tomar argumentos:
subkeyword = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) /
.filter_by(subkeyword_company_id=self.e_company_id) /
.filter_by(subkeyword_word=subkeyword_word) /
.filter_by(subkeyword_active=True) /
.one() /
PEP 8 tiene la intención de ser interpretado con una medida de sentido común y un ojo tanto para lo práctico como para lo bello. Infrinja felizmente cualquier directriz PEP 8 que resulte en código feo o difícil de leer.
Dicho esto, si con frecuencia te encuentras en desacuerdo con PEP 8, puede ser una señal de que hay problemas de legibilidad que trascienden tu elección de espacios en blanco :-)
Me gusta aplicar sangría a los argumentos en dos bloques, y la declaración en un bloque, como estos:
for image_pathname in image_directory.iterdir():
image = cv2.imread(str(image_pathname))
input_image = np.resize(
image, (height, width, 3)
).transpose((2,0,1)).reshape(1, 3, height, width)
net.forward_all(data=input_image)
segmentation_index = net.blobs[
''argmax''
].data.squeeze().transpose(1,2,0).astype(np.uint8)
segmentation = np.empty(segmentation_index.shape, dtype=np.uint8)
cv2.LUT(segmentation_index, label_colours, segmentation)
prediction_pathname = prediction_directory / image_pathname.name
cv2.imwrite(str(prediction_pathname), segmentation)
Mi elección personal sería:
subkeyword = Session.query( Subkeyword.subkeyword_id, Subkeyword.subkeyword_word, ).filter_by( subkeyword_company_id=self.e_company_id, subkeyword_word=subkeyword_word, subkeyword_active=True, ).one()
Parece que usa SQLAlchemy, si es cierto, el método sqlalchemy.orm.query.Query.filter_by()
toma varios argumentos de palabra clave, por lo que podría escribir como:
subkeyword = Session.query(Subkeyword.subkeyword_id,
Subkeyword.subkeyword_word) /
.filter_by(subkeyword_company_id=self.e_company_id,
subkeyword_word=subkeyword_word,
subkeyword_active=True) /
.one()
Pero sería mejor:
subkeyword = Session.query(Subkeyword.subkeyword_id,
Subkeyword.subkeyword_word)
subkeyword = subkeyword.filter_by(subkeyword_company_id=self.e_company_id,
subkeyword_word=subkeyword_word,
subkeyword_active=True)
subkeuword = subkeyword.one()
Puede usar paréntesis adicionales:
subkeyword = (
Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
.filter_by(subkeyword_company_id=self.e_company_id)
.filter_by(subkeyword_word=subkeyword_word)
.filter_by(subkeyword_active=True)
.one()
)
Simplemente almacene el resultado / objeto intermedio e invoque el siguiente método, p. Ej.
q = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
q = q.filter_by(subkeyword_company_id=self.e_company_id)
q = q.filter_by(subkeyword_word=subkeyword_word)
q = q.filter_by(subkeyword_active=True)
subkeyword = q.one()