PDA

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