Python: So definieren Sie eine Funktion, die eine Liste von Strings oder eine Zeichenfolge erhält

Angenommen, ich möchte eine Liste von Strings oder nur eine zu einer DB hinzufügen:

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

Und ich möchte, dass add_to_db beide Fälle akzeptiert

 add_to_db(names) add_to_db('John') 

Ist das der richtige Weg zu gehen:

 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() 

Was soll ich in die erste ... , als Bedingung, ob es eine Liste von Strings oder nur ein String (nicht vergessen, dass String ist auch iterable)?

5 Solutions collect form web for “Python: So definieren Sie eine Funktion, die eine Liste von Strings oder eine Zeichenfolge erhält”

Ich denke, Ihre beste Wette ist, einen einzelnen String zu einer 1-Element-Liste zu werfen, und dann haben Sie den Rest Ihrer Funktion ausschließlich mit Listen.

 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 >:( 

Verwenden Sie Keyword-Argumente:

 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']) 

Es ist vielleicht einfacher zu testen, ob das Objekt ein String ist, anstatt iterable. Das ist eine Technik, die ich vorher benutzt habe. Stellen Sie sicher, dass es eine Liste ist, dann durchschleifen:

 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() 

Sie können testen, ob das Argument das Attribut __iter__ hat, für das Strings fehlschlagen:

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

Von dieser Antwort .

Sie können den Typ Ihres Parameters überprüfen:

 >>> type('John') <type 'str'> >>> type(['explicit', 'is', 'better']) <type 'list'> 
Python ist die beste Programmiersprache der Welt.