proposal online enhancement docstrings python python-3.x coding-style

online - python enhancement proposal no 8 pep8



¿Debo devolver ninguno o(ninguno, ninguno)? (9)

¿Por qué no hacer del estado una propiedad de la ciudad? De esta forma, su función devolvería siempre un valor: una ciudad o ninguna.

Regresar (Ninguno, Ninguno) es malo por todas las razones indicadas en las otras respuestas y sirve solo para apoyar el desempaquetado de tuplas.

Ninguno es el mejor valor para volver a indicar que no se puede devolver una ciudad válida, pero tener una función que devuelva 1 o 2 valores no es tan buena, nuevamente debido al desempaquetado de tuplas.

Tenemos un método de objeto que devuelve una tupla de ciudad / estado, es decir (''Boston'', ''MA'') . Bajo algunas circunstancias válidas, no hay una ciudad / estado válido para regresar. Estilísticamente, ¿tiene más sentido devolver None o una tupla de dos elementos que contenga (None, None) en ese caso?


Al devolver solo un valor en circunstancias excepcionales, corre el riesgo de romper el modismo de desempaquetado de tuplas. Algunas de las personas que llaman podrían emitir:

city, state = getCityStateTuple("something")

En ese caso, devolver None interrumpirá la llamada con el error:

TypeError: ''NoneType'' object is not iterable

Entonces, yo personalmente regresaría (None, None) en su situación. Por otra parte, su kilometraje puede variar, y depende del patrón utilizado por las personas que llaman.


Como han señalado otros, una tupla con elementos en ella no se prueba como False , que es una de las razones por las que es posible que desee devolver None lugar de (None, None) . Sin embargo, es posible escribir una subclase de tupla que las pruebas como False incluso cuando tiene elementos en él anulando su __nonzero__() .

class falsetuple(tuple): def __nonzero__(self): return False

Luego puede devolver falsetuple((None, None)) cuando no hay ningún valor disponible. De hecho, siempre puedes devolver el mismo falsetuple .

No necesariamente estoy recomendando que hagas esto, de hecho tengo serias dudas acerca de incumplir esta convención, solo estoy diciendo que la veracidad de las tuplas no vacías no es necesariamente una razón en sí misma para no devolver una tupla.


Implementaría un método público para el objeto que regresó, digamos isValidLocation() que devuelve verdadero si la ubicación es válida y falsa si la ubicación no es ninguna.


Para mí, regresar (Ninguno, Ninguno) implicaría que (Ninguno, Estado) o (Ciudad, Ninguno) también serían valores de retorno válidos. Si ese es el caso, vaya con (Ninguno, Ninguno), de lo contrario, Félix y Brent proporcionan argumentos muy buenos para simplemente devolver Ninguno.


Si devuelve None, será mucho más fácil para usted verificar el valor devuelto.


Si su rutina normalmente devuelve una tupla, entonces una tupla es lo que debería seguir repitiendo. La verdadera elección es entre regresar (None, None) o hacer una excepción, y no tenemos suficiente información para ofrecer un buen consejo al respecto.

Si fuera yo, y elegí la tupla sobre la excepción, iría con la FalseTuple que sugiere un poco, y también me daré cuenta de que el código de llamada (que está usando el desempaquetado de tuplas) también puede probar

if city is None:

para ver si se obtuvo un resultado válido. De esta manera está apoyando la extracción de la tupla en todos los posibles valores de retorno, y todavía permite la expresión idiomática de preguntar al objeto: "¿Evalúa usted como verdadero?" (Aquí está el de Kindall para completarlo):

class FalseTuple(tuple): def __nonzero__(self): return False


Yo regresaría None . Si no hay ningún resultado, ¿por qué devolver algo que parece un resultado?

También es más fácil de probar:

result = getCity() if result: # do something

Solo regresaría (None, None) si fuera posible que solo uno de los dos valores sea None (es decir, (''Boston'', None) ). Sería más consistente en este caso.


(None, None) no evalúa a False en Python. Además, construir una tupla requiere más trabajo que, bueno, no construir una tupla. Entonces preferiría None .