Tengo algunas funciones en mi código que aceptan ya sea un objeto o un iterable de objetos como entrada.
Esto es algo muy excepcional ya menudo muy malo. Es trivialmente evitable.
es decir, pase [foo] en lugar de foo al llamar a esta función.
La única vez que puede justificar hacer esto es cuando (1) tiene una base de software instalada que espera un formulario (iterable o singleton) y (2) tiene que expandirlo para soportar el otro caso de uso. Asi que. Usted solo haga esto al expandir una función existente que tiene una base de código existente.
Si se trata de un nuevo desarrollo, no haga esto.
he llegado con dos ideas, pero no me gusta ninguno de los dos:
[Solo dos?]
FooOrManyFoos - Esto expresa lo que pasa, pero me podía imaginar que alguien no acostumbrado a que podría tener problemas para entender lo que significa de inmediato
¿Qué? ¿Dice que no proporciona NINGUNA otra documentación ni ninguna otra capacitación? ¿Sin soporte? No hay consejos? ¿Quién es el "alguien que no está acostumbrado"? Háblales. No asumas ni imagines cosas sobre ellos.
Además, no utilizan líder mayúsculas Nombres.
parámetro - Algunos nombre genérico. Esto deja en claro que puede ser varias cosas, pero no explica nada sobre para qué se usa el parámetro.
Terrible. Nunca. Hacer. Esta.
miré en la biblioteca de Python para ejemplos. La mayoría de las funciones que hacen esto tienen descripciones simples.
http://docs.python.org/library/functions.html#isinstance
isinstance (objeto, ClassInfo)
Lo llaman "ClassInfo" y que puede ser una clase o una tupla de clases.
se puede hacer eso, también.
Usted debe considerar el caso de uso común y las excepciones. Sigue la regla 80/20.
80% del tiempo, puede reemplazar esto con un iterable y no tener este problema.
En el 20% restante de los casos, tiene una base instalada de software basada en una suposición (ya sea un elemento iterable o único) y necesita agregar el otro caso. No cambie el nombre, simplemente cambie la documentación. Si solía decir "foo", todavía dice "foo" pero le haces aceptar un iterable de "foo" sin hacer ningún cambio en los parámetros. Si solía decir "foo_list" o "foo_iter", sigue diciendo "foo_list" o "foo_iter", pero tolerará en silencio un singleton sin romperse.
¿Debe aceptar un solo objeto, en lugar de un objeto iterable? Eso haría su código mucho más claro (es decir, pasar '[foo]' en lugar de 'foo'). – katrielalex
@katrielalex: Esto es posible. Tengo antecedentes en C++ y estoy acostumbrado a usar sobrecargas para este tipo de problema. Quizás tenga que replantearme algo aquí. –