Sì, se non c'è un modo "migliore" di fornire gli argomenti.
Ad esempio, utilizzando le classi ORM si parla, forse sarebbe più Python'y permettere ..
col = Varchar()
col.index = True
col.length = 255
..rather di ..
col = Varchar(index = True, length = 255)
Va bene che non è il miglior esempio, dal momento che il metodo **kwargs
sarebbe effettivamente più bello .. ma il mio punto è che dovresti sempre considerare metodi alternativi per ottenere qualcosa, prima di usare cose a volte scoraggiate come **kwargs
..
Un'altra cosa da tenere a mente è che si potrebbe perdere il comportamento di un utente si aspetta, come l'aumento di un TypeError se l'utente fornisce un ARG parola chiave non valida, che potrebbe essere aggirato come ..
def __init__(self, **kwargs):
valid_kwargs = ['x', 'y', 'z']
for k, v in kwargs.iteritems():
if k not in valid_kwargs:
raise TypeError("Invalid keyword argument %s" % k)
setattr(self, k, v)
Un ultima cosa da considerare:
class Hmm:
def __init__(self, **kwargs):
for k, v in kwargs.iteritems():
setattr(self, k, v)
def mymethod(self):
print "mymethod should print this message.."
x = Hmm(mymethod = None)
x.mymethod() # raises TypeError: 'NoneType' object is not callable
Questo è più corto rispetto alla versione nella domanda ma tenere presente che non funzionerà per gli attributi che sono proprietà (o altri descrittori). –
Non consiglio di fare così. A volte incontrava qualche errore. quando si aggiorna l'attributo builtin '__dict__'. –