Γράφεις σε python2 η σε Python3? Γιατί υπάρχει μία μικρή διαφορά μεταξύ των δύο σε σχέση με τα "starred arguments". Αλλά είναι λίγο λεπτομέρεια και μπορεί να σε μπερδέψει. Ξεκαθάρισε πρώτα τα παρακάτω.
Όπως και αν έχει, μία συνάρτηση που έχει στα arguments της το "*args" μπορεί να δεχτεί τυχαίο αριθμό positional arguments ενώ μία συνάρτηση που θα έχει το "**kwargs" μπορεί να δεχτεί τυχαίο αριθμό keyword arguments. Δες πχ αυτό
def f(*args):
print(args)
def g(a, b, c):
print(a, b, c)
f()
f(1)
f(1, 2)
f(1, 2, 3, "asdf")
g(1)
Όπως θα δεις αν εκτελέσεις το παραπάνω, η f τρέχει χωρίς να την νοιάζει πόσα arguments πέρασες, ενώ η g αν δεν της δώσεις 3 θα πετάξει exception.
Η διαφορά του *args με το **kwargs είναι οτι το δεύτερο αφορά keyword arguments. Πχ
def f(**kwargs):
print(kwargs)
f()
f(a=1)
f(a=1, b=2)
f(a=1, b=2, c=3)
f(1)
Πρόσεξε ότι η τελευταία κλήση θα πετάξει exception γιατί δίνεις positional και όχι keyword argument.
Μια άλλη διαφορά μεταξύ τους είναι ότι το args είναι μία λίστα ενώ το kwargs είναι ένα dictionary. Δες πχ
def f(*args, **kwargs):
print("args : ", type(args))
print("kwargs : ", type(kwargs))
f(1, 2, 3, 4, a="asfd", b="qwer", c=232.32)
Τα ονόματα args και kwargs δεν παίζουν κανένα ρόλο, αλλά συνηθίζεται να ονομάζονται έτσι. Αυτό που έχει σημασία κάθε φορά, είναι η ύπαρξη του ενός και των δύο "*" ανίστοιχα. Δηλαδή η f και η g είναι ακριβώς ισοδύναμες.
def f(*args, **kwargs):
pass
def g(*my_args, **my_kwargs):
pass
Δες και αυτά
stackoverflow.com/questions/2921847/pyth...rator-mean-in-python
www.python-course.eu/passing_arguments.php