Wie kann ich den optionalen Parameter eines namedtuple in einer Funktion übergeben?

__author__ = 'mayukhsarkar' import collections def search_student(database=None, ID=None): flag = False try: if ID is None or ID == 0: raise TypeError for each in database: if each.id == ID: print 'Student Name: ', each.name flag = True except TypeError: print 'Provide the arguments properly' finally: return flag studentDatabase = collections.namedtuple("student", "id name roll_no phone email") DATABASE = [studentDatabase(1, 'Mayukh Sarkar', 9, '555-2312', 'mayukh2012@hotmail,com'), studentDatabase(2, 'Alisha Sengupta', 7, '555-1345', 'alisha@gmail.com')] if not search_student(DATABASE, 1): print "Data not found" 

In diesem Snippet möchte ich eine Variable Argument Option in der Funktion search_student so dass, wenn ich die roll_no , email dann, wenn der Schüler dieser ID gefunden wird dann nur Roll & E-Mail wird zusammen mit Namen gedruckt. Aber wenn ich kein Argument verlasse, dann wird nur der Name gedruckt

3 Solutions collect form web for “Wie kann ich den optionalen Parameter eines namedtuple in einer Funktion übergeben?”

Verwenden Sie Booleschen, um die Flagge festzulegen, ob die Rolle und die E-Mail gedruckt werden soll oder nicht:

 def search_student(database=None, ID=None, roll=False, email=False): if ID is None or ID == 0: print 'Provide the arguments properly' return False for each in database: if each.id == ID: print 'Student Name: {}'.format(each.name) if roll: print 'Stutent Roll: {}'.format(each.roll_no) if email: print("Student email: {}".format(each.email)) break else: return "User does not exist in database" studentDatabase = collections.namedtuple("student", "id name roll_no phone email") DATABASE = [studentDatabase(1, 'Mayukh Sarkar', 9, '555-2312', 'mayukh2012@hotmail,com'), studentDatabase(2, 'Alisha Sengupta', 7, '555-1345', 'alisha@gmail.com')] 

Ausgabe:

 In [9]: search_student(DATABASE, 1, email=True,roll=True) Student Name: Mayukh Sarkar Stutent Roll: 9 Student email: mayukh2012@hotmail,com In [10]: search_student(DATABASE, 1,roll=True) Student Name: Mayukh Sarkar Stutent Roll: 9 In [11]: search_student(DATABASE, 1, email=True) Student Name: Mayukh Sarkar Student email: mayukh2012@hotmail,com In [12]: search_student(DATABASE, 1) Student Name: Mayukh Sarkar In [13]: search_student(DATABASE, 5) Out[13]: 'User does not exist in database' 

Ich würde auch die Benutzer in einem Dict mit der ID als Schlüssel speichern:

 def search_student(database=None, ID=None, roll=False, email=False): if ID is None or ID == 0: print 'Provide the arguments properly' return False get = database.get(ID) if get is not None: print 'Student Name: {}'.format(get.name) if roll: print 'Student Roll: {}'.format(get.roll_no) if email: print("Student email: {}".format(get.email)) else: return "User does not exist in database" 

Dann übergeben Sie einen Dict als Datenbank:

 studentDatabase = collections.namedtuple("student", "id name roll_no phone email") DATABASE = {1: studentDatabase(1, 'Mayukh Sarkar', 9, '555-2312', 'mayukh2012@hotmail,com'), 2: studentDatabase(2, 'Alisha Sengupta', 7, '555-1345', 'alisha@gmail.com')} 

Die Ausgabe ist gleich:

 In [18]: search_student(DATABASE, 1, email=True,roll=True)Student Name: Mayukh Sarkar Student Roll: 9 Student email: mayukh2012@hotmail,com In [19]: search_student(DATABASE, 1,roll=True) Student Name: Mayukh Sarkar Student Roll: 9 In [20]: search_student(DATABASE, 1, email=True) Student Name: Mayukh Sarkar Student email: mayukh2012@hotmail,com In [21]: search_student(DATABASE, 1) Student Name: Mayukh Sarkar In [22]: search_student(DATABASE, 5) Out[22]: 'User does not exist in database' 

Sie könnten besser dran mit einem Dikt für alle Logik aber getattr wird mit ** kwargs arbeiten:

 import collections def search_student(database=None, ID=None, **kwargs): if ID is None or ID == 0: print 'Provide the arguments properly' return False get = database.get(ID) if get is not None: print 'Student Name: {}'.format(get.name) for k in kwargs: print("Student {}: {}".format(k, getattr(get,k))) else: return "User does not exist in database" studentDatabase = collections.namedtuple("student", "id name roll_no phone email") DATABASE = {1: studentDatabase(1, 'Mayukh Sarkar', 9, '555-2312', 'mayukh2012@hotmail,com'), 2: studentDatabase(2, 'Alisha Sengupta', 7, '555-1345', 'alisha@gmail.com')} search_student(DATABASE,1,roll_no=True,email=True) 

Wir müssen fangen, wenn ein Benutzer ein ungültiges Schlüsselwort / Attribut eingibt, es gibt viele Möglichkeiten, es zu behandeln, aber ein einfacher Weg ist, den Attributfehler zu fangen:

  try: print("Student {}: {}".format(k, getattr(get, k))) except AttributeError: print("Informative message or whatever is suitable") 

Oder benutze hasattr und tu, was du willst, wenn es False zurückgibt:

  if get is not None: print 'Student Name: {}'.format(get.name) for k in kwargs: if not hasattr(get,k): continue print("Student {}: {}".format(k, getattr(get, k))) 

Oder übergeben Sie einen Standardwert an getattr:

 if get is not None: print 'Student Name: {}'.format(get.name) for k in kwargs: val = getattr(get, k,False) if val: print("Student {}: {}".format(k, val)) else:.... 

Sie können die ** Notation verwenden, um eine variable Anzahl von benannten Argumenten an Ihre Funktion zu übergeben.

Wenn das Argument ist, dann wäre es ein Wörterbuch von beliebigen Argumenten, die noch nicht in der Funktionsdefinition definiert sind, dann können Sie überprüfen, ob roll_no oder email in args wenn ja, machen Sie Ihre Logik.

Beispielcodes –

 >>> def func(**args): ... print(args) ... if 'abc' in args: ... print(args['abc']) ... >>> func(hello=10) {'hello': 10} >>> func(hello=10,abc="Student") {'hello': 10, 'abc': 'Student'} Student >>> def search_student(database=None, ID=None, **args): ... if 'roll_no' in args: ... print(args['roll_no']) ... >>> search_student(roll_no=10) 10 

So ist das nicht die Antwort aber ein Beitrag, weil @Rob um weitere Klärung gebeten hat

Also wenn die Funktion existiert, sagt func(database=None, ID=None, [optionals])

func(DATABASE, 1, roll_no, email) wenn du func(DATABASE, 1, roll_no, email) Name der Person, deren ID 1 & sein / ihr E-Mail & Roll ist, wird auch gedruckt

Aber wenn ich func(DATABASE, 1, roll_no, email, phone) dann Name Roll E-Mail und Telefonnummer wird gedruckt werden, aber wenn ich nur DATABASE & ID & keine optionals geben, dann nur Name sollte gedruckt werden .. Wenn kein Datensatz ist Mit dieser ID gefunden, dann sollte es nichts drucken

Python ist die beste Programmiersprache der Welt.