__main__-scope, rätt uppfattat?

  • Författare
  • Meddelande
Användarvisningsbild

annettekusma

sql-guru

  • Inlägg: 102
  • Blev medlem: 11 aug 2017, 10:16
  • Ort: Eskilstuna

__main__-scope, rätt uppfattat?

Inlägg27 sep 2017, 13:17

Scenario 1:

Jag importerar kroppen.py och cli_parser.py i min fil huvud.py.

Om jag kör huvud.py och ifrån den anropar cli_parser.parse_args(),

"lever" då namespace objektet "cli_parser.options" i det så kallade __main__-scope?
och kan jag då utan vidare anropa det även inifrån kroppen.py's funktioner?

eller måste jag skicka med namespace objektet från huvud.py till funktionerna i kroppen.py?


Scenario 2:

Jag importerar kroppen.py och handen.py i min huvud.py
I kroppen.py importerar jag cli_parser.py

Sedan kör jag huvud.py som anropar kroppen.py
Och kroppen.py anropar cli_parser.parse_args()

då lever cli_parser.options i kroppen-scope, men inte i __main__-scope
och då kan jag inte anropa det direkt inifrån funktionerna i handen.py?


Och egentligen är det inte ogrammatiskt att inte använda main.py som filnamn på det man ska köra i en en mapp med många filer, bara opraktiskt och okonventionell?
Och if __name__ == __main__ bla bla skulle således funka precis lika bra om filen hetat huvud.py?
Användarvisningsbild

Allinrep

dbwebb

  • Inlägg: 1124
  • Blev medlem: 03 sep 2012, 09:19
  • Ort: Portugal (tillfälligt)

Re: __main__-scope, rätt uppfattat?

Inlägg27 sep 2017, 13:29

Som svar på din sista fråga så spelar filnamnet ingen roll, det finns ingen magi i namnet.

Som svar på de första frågorna så tror jag att det bästa är att du gör ett eget testprogram och tar reda på vad som gäller.
Användarvisningsbild

annettekusma

sql-guru

  • Inlägg: 102
  • Blev medlem: 11 aug 2017, 10:16
  • Ort: Eskilstuna

Re: __main__-scope, rätt uppfattat?

Inlägg27 sep 2017, 14:58

Negativt. Jag försöker förenkla frågan istället för koden:

1) vilket scope har ett objekt som instantieras i en importerad fil?
2) vilka scope har funktionerna i en importerad fil tillgång till?

Det borde vara frågor som besvaras av pythongrammatiken, men jag har läst mig till mycket annat under kursens gång men för tillfället räcker inte tiden att grotta mera.

Gjorde en ansats att göra exempelfiler, men det fallerar på att jag inte dykt in i objekt-konceptet (annat än att man använt objekt som färdiga moduler slungar ur sig). För variabler verkar det bli fel i alla fall:


huvud.py:
Kod: Markera allt
import kroppen
import benen

print("inifrån huvud.py kan man komma åt benen.variabel: {}", benen.variabel)

kroppen.fixa()

(EDIT: felanvändning av replacement field, irrelevant i sammanhanget)

benen.py:
Kod: Markera allt
variabel = "fingrar"


kroppen.py:
Kod: Markera allt
def fixa():

    print("inifrån kroppen.py så ger anrop till benen.variabel följande: ")
    print(benen.variabel)



körning:
Kod: Markera allt
>>>
RESTART: C:\Users\Annette\Dropbox\bth\dbwebb-kurser\python\me\kmom05\argparse\test-scope\huvud.py
inifrån huvud.py kan man komma åt benen.variabel: {} fingrar
inifrån kroppen.py så ger anrop till benen.variabel följande:
Traceback (most recent call last):
  File "C:\Users\Annette\Dropbox\bth\dbwebb-kurser\python\me\kmom05\argparse\test-scope\huvud.py", line 8, in <module>
    kroppen.fixa()
  File "C:\Users\Annette\Dropbox\bth\dbwebb-kurser\python\me\kmom05\argparse\test-scope\kroppen.py", line 4, in fixa
    print(benen.variabel)
NameError: name 'benen' is not defined
>>>


dvs funktionen kroppen.fixa() verkar leva mera inne i kroppen.py än i __main__scope. Har provat att kalla vid namn __main__.benen.variabel plus några varianter, utan resultat. Om det är likadant för objekt som för variabler så får jag väl helt enkelt skicka med objektet när jag anropar funktioner i tredje fil.
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11176
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: __main__-scope, rätt uppfattat?

Inlägg27 sep 2017, 16:53

Se det som att allt som definieras i en modul är lokalt för modulen. Det är en bra grunduppfattning att utgå ifrån.

Modulen har ett publikt API i form av de funktioner den erbjuder. När man anropar en funktion så är det "bara" det som finns tillgängligt i modulen som går att använda.

Modulen känner bara till sig själv.

Modulen kan naturligtvis importera andra moduler och på så sätt vidga sin bekantskapskrets.

Det låter lite som du kom fram till detta via dina testprogram.
...
..:
.... /mos
Användarvisningsbild

annettekusma

sql-guru

  • Inlägg: 102
  • Blev medlem: 11 aug 2017, 10:16
  • Ort: Eskilstuna

Re: __main__-scope, rätt uppfattat?

Inlägg28 sep 2017, 07:15

Ja, som sagt för en enkel simpel variabel kom jag fram till det. Jag hade nån förhoppning om att ett (namespace) objekt var nånting som mera lever sitt eget liv och kanske kan tillgås via det däringa __main__-scope.

Men icke!! Jaja, bara att skicka med grejerna istället då.

Tack båda!
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11176
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: __main__-scope, rätt uppfattat?

Inlägg28 sep 2017, 09:16

En modul kan ha globala variabler som är nåbara utanför modulen. Men man vill gärna undvika den typen av konstruktioner. Man får då en variabel som kan läsas/skrivas från många platser vilket gör det svårt att se vem som använder det.

För konstanter kan det vara bra, men inte för variabler man skriver till, de vill man hellre kapsla in inuti en modul.
...
..:
.... /mos
Användarvisningsbild

annettekusma

sql-guru

  • Inlägg: 102
  • Blev medlem: 11 aug 2017, 10:16
  • Ort: Eskilstuna

Re: __main__-scope, rätt uppfattat?

Inlägg04 okt 2017, 10:12

Hmm, ja, jag vill minnas från vad jag läst tidigare att man bör undvika globala variabler.

Men ett kommando man gett, och det namespace-object man parsat fram av det, är ju egentligen väldigt konstanta, så det vore väl ypperliga objekt att ha tillgängliga globalt. Jag menar, man parsar ju kommandot bara en gång i början, sen ändrar man ju inte efteråt vad användaren har befallt så att säga. =)
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11176
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: __main__-scope, rätt uppfattat?

Inlägg04 okt 2017, 16:45

Jag är inte hundra på vad du menar, men lite av tanken att globala variabler är "dumt" är att det blir svårt att se vem och var den ändras. När en variabel exponeras så ger det möjlighet att ändra dess värde från många platser, ibland kan det vara önskvärt, ibland är det ett bekymmer om man vill hellre kapsla in den i modulen och inte tillåta att någon petar på den utifrån. Man ser den som en resurs synlig enbart inuti modulen och kanske erbjuder man ett api av funktioner som läser/skriver till den.

Som ett litet inlägg i globala variabler kontra inkapsling.
...
..:
.... /mos
Användarvisningsbild

annettekusma

sql-guru

  • Inlägg: 102
  • Blev medlem: 11 aug 2017, 10:16
  • Ort: Eskilstuna

Re: __main__-scope, rätt uppfattat?

Inlägg09 okt 2017, 15:44

Följetongen fortsätter....

Jag använder logging-modulen för att skriva ut debug-meddelanden. Vill man stänga av debug-meddelandena så skriver man bara överst i filen logging.disable(lämpliga.argument), vill man ha meddelandena igen så kommenterar man bort raden tillfälligt.

Man måste importera den modulen i varje modul som man vill kunna använda den i. Men: stänger man av den i en av modulerna, även om det bara är i en av de moduler man inte håller på med för tillfället (ex när man testar title-kommandot, så använder man inga funktioner ur analyzer-modulen), så är den avstängd i de andra modulerna med! Förargligt!

Det finns säkert inbyggda sätt att hantera detta (typ en motsvarande logging.enable()-funktion), jag har inte dykt ner på djupet i logging-modulen, men som sagt, det där med scope känns fortfarande lite rörigt när man jobbar med moduler. =)
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11176
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: __main__-scope, rätt uppfattat?

Inlägg10 okt 2017, 08:50

Kanske borde modulen som använder din logging-modul, själv sätta på och stänga av loggningen, kanske via ett funktionsanrop (bättre än global variabel).

Så kan man logga bara vissa delar av koden. Men det låter nästan som du redan har den fuktionliteten, bortsett från att du editerar i modulen direkt, låt de användande modulenra sätta på och stänga av loggningen istället.

Som en variant.
...
..:
.... /mos
Användarvisningsbild

annettekusma

sql-guru

  • Inlägg: 102
  • Blev medlem: 11 aug 2017, 10:16
  • Ort: Eskilstuna

Re: __main__-scope, rätt uppfattat?

Inlägg14 okt 2017, 21:00

Hmm, nu vet jag inte om vi pratat förbi varandra...

i main.py har jag import fil1 och import fil2.
i fil1.py har jag dels import logging och dels ett fristående logging.disable()-anrop; den senare kommenterar jag bort så länge jag vill ha loggningen.
i fil2.py har jag likadant som i fil1.

dvs det är redan inne i varje modul som jag stänger av och sätter på loggningen. Får disable-anropet vara okommenterat (dvs aktivt) i fil2 så funkar inte loggning från fil1 heller.


Jag har i och för sig inte testat hur det blir om jag skulle ha ett anrop till logging.disable() i varje funktionsdefinition inne i fil1 och fil2 (vad jag u skulle vinna på det, enklare att kommentera bort respektive logg-anrop). Men eftersom importerandet av fil1 till main.py verkar göra att ett icke-bortkommenterat logging.disable()-anrop stänger av loggningen för resten av programmet så känns det som att detsamma borde gälla när programmet väl kommer till en funktion där det stängs av.

Jag har letat lite mer i logging-dokumentationen (https://docs.python.org/3/library/logging.html# med tillhörande https://docs.python.org/3/howto/logging.html#logging-basic-tutorial och https://docs.python.org/3/howto/logging-cookbook.html#) men inte hittat något begripligt som gör det jag vill. Jag tror att lösningen kan vara att skapa ett logger-objekt för varje modul, men som sagt, jag har inte riktigt fattat/lyckats.

Tror att det annars är en och samma logger-objekt (root-logger) som loggar allt och ett disable-anrop switchar något i detta root-logger-objekt, och det är därför som disable-anropet har en intermodal effekt. HAH! Tillbaka på ruta ett: då är ju logger-objektet inne i någon intergalaktisk scope!! *aahrrgrhgrh* snurrigt värre!

Vilka är online

Användare som besöker denna kategori: Bing [Bot] och 13 gäster