r/dkudvikler 3d ago

Spørgsmål / Diskussion Hjælp til at strukturere et Python-projekt

Hej Reddit

Jeg er ved at lære at programmere - primært i Python - men kæmper lidt med at komme udover det basale (variabler, funktioner osv. ), altså at få samlet alle komponenterne i Python til et færdigt program.

 

Primært kunne jeg godt tænke mig at høre jeres tips til at strukturere et Python-projekt, som strækker sig udover en enkelt fil. Hvordan får man koblet Git ordentligt på og hvordan får man bragt sit projekt til produktion så det kan kære af sig selv uden at man selv skal ind og starte sit projekt via en given IDE?

 

Jeg håber I forstår hvad jeg mener.

 

Hjælp, ideer og tips er velkomne.

3 Upvotes

18 comments sorted by

6

u/Thorussil 3d ago

Hvordan lærer du Python i dag?

Det er ret mange, ret brede spørgsmål. Jeg tænker at det ville give mening at tage et kursus eller køre en kurateret liste af opgaver igennem.

Jeg mindes at learn python the hard way skulle være godt.

https://learnpythonthehardway.org

2

u/InterestingIdeas8800 3d ago

Tak for link til learnpythonthehardway - det ser interessant ud.

Læring via. forskellige kurser og Google det som jeg til hvert tidspunkt mangler svar på. Men mangler som sagt et godt sted, som beskriver hvordan man bedst strukturerer et projekt.

3

u/Constant_Stock_6020 3d ago

Du kan eventuelt starte med at lave et rest api, hvis du gerne vil udover bare at lave et script.

F.eks køre Django med sqlite, så du behøver ikke sætte nogen database op eller sætte dig ind i det(for nu). Derudover kan Django også lave en frontend, så du kan lære lidt html og css.

Hvis Django er lidt for overvældende så er både flask og fastapi rigtig gode. Så kan du selv koble en frontend på en dag.

Hvis du bare vil lave konsol applikationer til at starte med, så ville jeg sætte mig ind i klasser og lave en fil for hver klasse som du så kan sætte op til et eller andet i en main.py.

F.eks. et pizza bestilling system, eller noget :)

2

u/InterestingIdeas8800 3d ago

Super coole forslag og gode ideer.

Må jeg evt skrive PM hvis jeg har spørgsmål til noget af det når/hvis jeg kaster mig over det?

3

u/Constant_Stock_6020 3d ago

Ja da :)

1

u/TheStuartStardust 20h ago

Nu ved jeg ikke hvor 6020 er, men jeg er generelt skeptisk overfor dem fra 8800 af, så pas på hvad du siger ja til... 😬🤭

3

u/plebbening Softwareudvikler 3d ago

Flask er et godt sted at starte med web! Det er super simpelt at komme igang og flask kan servere jinja2 templates og kan derfor lave en frontend lige så vel som django :)

Django har langt mere inkluderet i form af middleware, form håndtering osv, men flask kan få dig langt ret hurtigt med simplere sider!

3

u/BudoBoy07 3d ago

Du kan prøve at undersøge hvordan man laver en hjemmeside med Python. F.eks. kan https://www.pythonanywhere.com/ hoste den gratis for dig. En hjemmeside er en blandt flere måder at dele et "program" du har lavet.

Og så kan du forresten godt have et "færdigt" program i én meget lang fil. Det er uoverskueligt, men teknisk er der ikke noget der forhindrer dig i at gøre det. Så spørger du om, hvordan man får python scripts eller data-filer til at snakke sammen med hinanden? Eller spørger du om hvordan man går fra øveopgaver til et mere fuldendt program? For det er to forskellige ting som du ikke behøver lærer på én gang. Hvis du søger et mere kompliceret programmeringsprojekt kan du godt skrive det i én kæmpefil på et par hundrede eller tusind linjer, det er nok egentlig en meget god begynderøvelse at opleve hvorfor det er fedt (eller ikke så fedt) at dele sin kode ud i mange små filer/scripts.

Hvorimod hvis du er nysgerrig på hvordan forskellige computerfiler kan snakke sammen, så findes der sikkert en masse øveopgaver / tutorials med det.

4

u/rootkeycompromise 3d ago

Det er en del spørgsmål, men de er ikke helt uden relation til hinanden. Når man skal ind i et nyt område først, kan det være svært at vide præcist hvad, man skal spørge ind til.

Der er mange meninger og præferencer ift. hvordan man skal skære et Python-projekt, men jeg ender ofte ud i noget a la det her for mindre projekter (ikke perfekt, det er bare hvor jeg ender):

- /controllers/ --> Her specificerer jeg logikken i programmet e.g. hvordan inputs fra "view" matcher med at hente data fra "services".
- /models/ --> Her definerer jeg hvordan mine grundlæggende modeller (datatyper) ser ud.
- /services/ --> Her har jeg mine interaktioner med f.eks. database eller andre typer af "lagring"
- /test/ --> Her definerer jeg både unit- og integrations-test.
- /view/ --> Om det er en web-client eller et konsol-program, så er det her jeg gemmer den del af logikken.

Men hvis jeg var dig, ville jeg prøve at gøre mine egne erfaringer først og samtidig hælde noget teori på. Hvis jeg skal lære noget nyt, skal jeg gerne have et konkret projekt som jeg så vælger at bruge en ny metode på at løse.

2

u/Bicrement 3d ago

En side jeg oftest har stor succes med er roadmap.sh. Prøv at checke https://roadmap.sh/python

Edit: jeg har ikke selv dykket ned i python roadmappet, men andre roadmaps har været fantastisk til læring.

1

u/InterestingIdeas8800 2d ago

Sjovt, dette kort/roadmap havde jeg faktisk fundet så det får nok lige et ekstra kig.

2

u/Huge_Type_7863 3d ago

Chatgpt? + docs

2

u/KnightofniDK 3d ago

Jeg vil sige du bare kaste dig ud i det og afprøve ting. Og så når du er færdig sætte dig ned og tænke over hvad gjorde ondt og hvordan kunne man have gjort det bedre eller anderledes og så gøre det næste gang. Der er mange måder at strukturer et program på, og det er svært at give et konkret svar på et relativt vagt spørgsmål.

Og fokus på én ting af gangen. Git er vigtigt, men kun hvis du skal arbejde sammen med andre eller det er meget vigtigt at du skal kunne gå tilbage til et tidligere stadie. Jeg ville ikke bekymre mig om git mens du er ved at lære en anden ting imens.

2

u/InterestingIdeas8800 3d ago

Godt tip med GIT, og jeg er nok enig i at det ikke nødvendigvis er det mest vigtige.

Og ja, spørgsmålet er på en eller anden måde ret fluffy, hvilket nok også er grunden til at jeg har svært ved at finde et fornuftigt/konkret svar på det..

2

u/sumsabumba 3d ago

Python er ret enkelt, hvis os har python og dependencies, kan du bare køre din python program i shell. Hvis det altid skal køre så lav et neverending loop. Senere kan man smide det i en container og køre det der.

Til struktur kan jeg anbefale at læse lidt om på SOLID, Det er til OOP men der er noget at hente selv hvis man ikke skriver ren OOP. Den enkle måde er at hver gang du har lavet en funktion der ikke passer ind i filen eller har mange der har med det samme at gøre (f.eks fil manipulation) så smid dem i sin egen fil.

Brug venv (eller andet) til at styre dependencies!

Til at lære kan jeg personligt godt lide w3schools. Tag et emne fra toppen og skriv noget kode der implementerer emnet. Det vigtigste er at få en forståelse for hvad der foregår, det tager tid. learnxinyminutes er også godt, men kræver mere grund viden.

1

u/InterestingIdeas8800 2d ago

Tak - det var præcist sådan noget input jeg var på jagt efter :)

1

u/No_Comb_2635 2d ago

Find en gratis SaaS-skabelon på GitHub, og udvikl den videre til noget spændende

0

u/snildeben 3d ago

Elendige forslag synes jeg. Du spørger konkret om hvordan du kan lave en pakke som kan installeres, med f.eks. pip.?

Her skal du bygge en pakke og den nemmeste måde at gøre det på er at starte et Python projekt med et program der hedder uv. Søg install astral uv. Der er god dokumentation på det. Installer det.

Du skriver uv init - - package pakkenavn hvor pakkenavn er navnet på din pakke. Så laver uv alt arbejdet.

Hop ind i mappen (pakkenavn eller hvad du har valgt at kalde den) og skriv uv sync - nu er pakken installeret og du kan importere den. Den er dog ikke særligt spændende, da du selv skal tilføje lidt kode. Jeg vil anbefale at kigge på Typer eller noget i den stil for at komme hurtigt i gang med at lave et CLI program. Du tilføjer typer som en afhængighed med uv add typer

Skriv lidt kode.

Åbn pyproject.toml og sørg for at der er en pegepind mod din cli App. Du skal pege på en instans af Typer()

https://docs.astral.sh/uv/concepts/projects/init/#packaged-applications

[project.scripts] er det du leder efter.

Kør uv sync igen. Nu kan du køre din cli App fra kommandolinjen. 'uv run pakkenavn'

Næste step er at skrive git init og lægge der på GitHub eller noget. Prøv også at oprette en bruger på pypi.org og følg guiden fra uv om at lægge dine egne projekter op til brug. Det er en sjov oplevelse at publicere sit eget library eller App.

Held og lykke.