Pogčedajte punu verziju : python prosedjivanje parametara
cvele
03. 03. 2011., 09:43
Imam sledecu situaciju:
self.connect(storageDirButton, QtCore.SIGNAL('clicked()'),
self.showDirectoryDialog)
self.showDirectoryDialog je metod unutar klase, kojem trebam da prosledim neki parametar, kako to da uradim :)?
Ukoliko uradim
self.connect(storageDirButton, QtCore.SIGNAL('clicked()'),
self.showDirectoryDialog(param))
metod ce se izvrsiti cim pokrenem app, sto ne zelim.
djipko
03. 03. 2011., 10:31
Pa sad napamet mada mozda nije najelegantnije resenje, mozes da uradis onu foru iz prethodne teme jablanovu sa funkcijom koja vraca funkciju i to ce zbog closure-a uvek da radi:
def DirectoryDialogFactory(param):
def showDirectoryDialog():
#use param somewhere
return showDirectoryDialog
#...
self.connect(storageDirButton, QtCore.SIGNAL('clicked()'),
self.DirectoryDialogFactory(param))
Ali mozda moze i elegantnije posto ne znam kako klasa izgleda mozda sa nekim introspektivama ili drugacijim dizajnom klase
cvele
03. 03. 2011., 13:10
Kompletna klasa je: https://github.com/cvele/uTorrent-Auto-Extractor/blob/master/configuration.py
djipko
03. 03. 2011., 14:31
Kolko vidim u kodu funkciji kao param uvek prosledjujes self.storageDirEdit koji je clan klase tako da ne vidim sto ga jednostavno ne bi uvek koristio u funckiji umesto sto ga prosledjujes kao parametar. Ako postoji neki razlog dalje u kodu onda ok.
Samo jos par stilskih saveta koji se odnose na Python tj stil kodiranja:
while i<s:
if self.l[i] is not None and str(self.l[i].text()) is not '':
options['Labels'][str(self.l[i].text())] = str(self.e[i].text())
i += 1
se u Python-u pise otprilike ovako:
for i, el in self.l.eunmerate():
if el and str(el.text()):
options['Labels'][str(el.text())] = str(self.e[i].text())
(Mada ako u l i e koristis indekse tako - mozda dict umesto liste?)
Dok konstrukti tipa:
if self.useImdbCheckbox.isChecked():
options['Global']['imdb'] = '1'
else:
options['Global']['imdb'] = '0'
elegantnije mogu da budu napisani:
options['Global']['imdb'] = self.useImdbCheckbox.isChecked() and '1' or '0'
Ovo poslednje je JS fora ali dok je tamo ne treba koristi u zbog coercion-a u Pythonu se cak preporucuje.
Ovo nije pokusaj cepidlacenja nego proizilazi iz Zen of Python dela:
"There should be one—and preferably only one—obvious way to do it.".
Naravno da tvoje radi savrseno, ali stil je bitna stvar u Python jer je jezik koji dozvoljava svojim konstruktima da stil bude manje vise unificiran sto doprinosi da maltene svako moze da cita svaciji kod. Nikako zanemarljiva osobina.
Procitaj isto i (ako dosad nisi): http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
cvele
03. 03. 2011., 14:47
Slobodno cepidlaci, tu app pisem da bih ucio jer mi je ovo jedan od prvih kontakata sa pythonom.
Inace ne prosledjuje se uvek storageDirEdit, u metodu createLabelStorageInput se prave nova input polja tako da tu prosledjujem druge varijable.
thanks za link
vBulletin® v3.6.8, Copyright ©2000-2024, Jelsoft Enterprises Ltd.