• Register

Urejanje kode s presledki

+5 votes
145 views

Zanima me, kako naj uredim kodo pri seminarju, kar se tiče presledkov pri aritmetičnih operacijah. Na prvem predavanju ste nas opozorili, da po PEP8 pri aritmetičnih operaterjih postavimo presledke po občutku. Torej je povsem vseeno, ali napišem:

prvi primer: izraz = domet.subs(t, 2*v0*sym.sin(fi)/g)

ali

drugi primer: izraz = domet.subs(t, 2  * v0 * sym.sin(fi) / g) ?

Tukaj se mi zdi prva možnost veliko preglednejša, pri nekaterih drugih izrazih pa bi zaradi preglednosti in estetike uredil po zgledu drugega primera..  Je stvar povsem subjektivna? Lahko seminar, kar se aritmetičnih presledkov tiče, uredimo po svoje, kakor se nam pri določenem primeru zdi estetsko boljše? Ostala pravila ( npr. en presledek pri operatorju =, torej a = 5 in ne a=5) glede stila sem pri urejanju upošteval.

asked Jan 12 by TimotejKadilnik (2,770 points)

2 Answers

+2 votes
Pri argumentih metod je po pep8 lahko eno ali drugo (razlog je v tem, da je krajša/kompaktna oblika lahko bolj pregledna), sicer pa je priporočeno s presledkom. (tako približno je komentirano tudi v knjigi)
answered Jan 12 by janko.slavic (74,430 points)
0 votes

Hvala za hiter odgovor. Si bom kar sposodil to svojo temo, da ne odpiram nove. Pri seminarju imam še tri težave, ki jih želim rešiti pred oddajo.

1. Poskusil sem narediti zelo preprosto pojavno okno z modulom tkinter. Namen je samo, da se okno odpre in ima uporabnik dva funkcionalna gumba, Pozdravljeni in Izhod. Po pritisku na prvi gumb se v notebooku izpiše "Pozdravljeni!", funkcija gumba izhod pa je jasna. Primer je povsem začetniški (če bo čas dopuščal, ga bom pred oddajo nadgradil). Koda je sledeča:

from tkinter import Tk, Label, Button

class Moj_Prvi_UI_Vmesnik:
    def __init__(self, master):
        
        self.master = master
        master.title("Preprost UI")

        self.label = Label(master, text = "Moj_prvi_UI_vmesnik!", )
        self.label.pack()

        self.greet_button = Button(master, text = "Pozdravljeni", command = self.greet, fg = "Green" )
        self.greet_button.pack()

        self.close_button = Button(master, text = "Izhod", command = master.quit, fg = "Blue")
        self.close_button.pack()

    def greet(self):
        print("Pozdravljeni!")

root = Tk()
my_gui = Moj_Prvi_UI_Vmesnik(root)
root.mainloop()

Okno se pojavi in gumb deluje, le Kernel mi "zašteka" - zvezdica ostane. Če ima kdo kakšno idejo, zakaj, bi bil hvaležen.

2. Naredil sem animacijo gibanja kroglice po trajektoriji. Animacija deluje le, če okno poženem večkrat, pa je koda povsem identična. Zakaj je temu tako? Prvič se pojavi samo belo okno ali pa je animacija popačena (ni jasna, vmes izgine itd). Ko drugič poženem isto celico, je animacija delujoča. Narejena je z matplotlib.animation.  Zanima me še, kako jo "lepo" vgradim v notebook - zaenkrat v matplotlib notebook načinu in deluje, kot da je v svojo celici.

3. Pri enem izmed grafov v matplotlibu mi pri prvem zagonu celice napiše:

AtributeError:"Nonetype" object has no attribute "remove_callback"
Ko identično celico poženem še drugič, se mi graf normalno izriše.
 
Če ima kdorkoli kakšno idejo glede zgornjih problemov, mu bom hvaležen.
Lep vikend
answered Jan 13 by TimotejKadilnik (2,770 points)
Jupyter kernel v ozadju poganja dogodkovno zanko ("event loop"), ki čaka na in izvršuje vaše ukaze. Zato so v jupyter notebook-u v splošnem težave s funkcijami, ki prav tako potrebujejo še eno tako zanko (tipično vse stvari, ki se dogajajo interaktivno).

1. Kodo uporabniškega vmesnika raje shranite v Python modul (na primer "gui.py"). Če je ta modul shranjen v isti mapi, kot vaša .ipynb datoteka, lahko kodo v njem iz jupyter notebook-a izvedete takole:

    !python gui.py

Vaš primer vmesnika se tako izvede brez težav.

2. V jupyter matplotlib okoljih so pogosto težave tudi z animiraniimi prikazi. Poskusite v celici pred kodo animacije vklučiti Tkinter matplotlib okolje:

    %matplotlib tk

Animacija bi se po tem morala odpreti v posebnem oknu, tipično z manj težavami. Kasneje lahko spet vključite "inline okolje" z `%matplotlib inline`.

3. Zelo težko je ugotoviti, kaj bi lahko bilo narobe, brez kode prikaza. Mogoče je napaka povezana s težavami pri prikazu matplotlib animacije - v tem pprimeru bio rešitev 2. morda pomagala tudi tukaj.

P.S. Mogoče bi bilo v zvezi z odpiranjem Tkinter vmesnika in matplotlib animacije vseeno smiselno postaviti novi temi, ki ju bodo lažje našli tudi ostali študentje.
...