Python: как определить функцию, которая получает список строк ИЛИ строку

Предположим, я хочу добавить список строк или один из них в БД:

names = ['Alice', 'Bob', 'Zoe'] 

и я хочу, чтобы add_to_db принял оба случая

 add_to_db(names) add_to_db('John') 

Это правильный путь:

 def add_to_db(name_or_names): if (...): ... # add a single name else: for name in name_or_names: ... # add a single name commit_to_db() 

Что я должен положить в первый ... , как условие того, является ли это списком строк или просто строкой (не забывайте, что строка также является итерируемой)?

5 Solutions collect form web for “Python: как определить функцию, которая получает список строк ИЛИ строку”

Я считаю, что лучше всего наложить одну строку в список из 1 элемента, а затем остальную часть вашей функции будет заниматься исключительно списками.

 def add_to_db(name_or_names): import types if isinstance(name_or_names, types.StringTypes): name_or_names = [name_or_names] try: for name in name_or_names: add_name(name) commit_to_db() except TypeError: # we didn't get a string OR a list >:( 

Использовать аргументы ключевого слова:

 def add_to_db(name=None, names=None): if name: ..... elif names: .... else: raise ValueError("Invalid arguments") add_to_db(name='John') add_to_db(names=['explicit', 'is', 'better']) 

Возможно, проще проверить, является ли объект строкой, а не итерируемой. Это техника, которую я использовал раньше. Убедитесь, что это список, затем прокрутите его:

 def add_to_db(name_or_names): if isinstance(name_or_names, basestring): # str or unicode, convert to list name_or_names = [name_or_names] for name in name_or_names: add_name_to_db() 

Вы можете проверить, имеет ли аргумент атрибут __iter__ , для которого строки будут терпеть неудачу:

 if hasattr(arg, '__iter__'): print "I am an iterable that is not a string!" 

Из этого ответа .

Вы можете проверить тип своего параметра:

 >>> type('John') <type 'str'> >>> type(['explicit', 'is', 'better']) <type 'list'> 
  • Очистить экран в оболочке
  • Загрузите изображение в хранилище Appengine Datastore с помощью BlobStore и конечных точек
  • Как динамически создавать свойства в Python?
  • Python: subprocess.Popen и subprocess.call зависают
  • Python, как читать байты из файла и сохранять его?
  • Могу ли я вставлять удаляемые символы в буфер ввода python?
  • Почему в Python иногда из импорта PIL изображение выходит из строя и импортируется Image?
  • Как преобразовать вывод for loop в список (python)
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.