Vinnaren i pepparkakshustävlingen!
2020-09-17, 18:49
  #1
Medlem
Tjena.

Har en fråga om hur man skriver ett script utan att bruke with statement.

Följande eksempel har jag tittat på:
Kod:
hostname = 'ifconfig.me'  
tor = TorClient()
# Choose random guard node and create 3-hops circuit
with tor.create_circuit(3) as circuit:
    # Create tor stream to host
    with circuit.create_stream((hostname, 80)) as stream:
        # Now we can communicate with host
        stream.send(b'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % hostname.encode())
        recv = stream.recv(1024)

Men har lyst att skriva det på något sätt som liknar på:
Kod:
self.tor = torpy.TorClient()
self.tor.create_circuit(5)
self.tor.create_stream(("ifconfig.me",80))
self.tor.send(b'GET / HTTP/1.0\r\nHost: ifconfig.me\r\n\r\n')

Uppenbarligen fungerar det inte sedan felet: 'TorClient' object has no attribute 'create_stream' (och det ligger i korterna att det är jag som orsakat felet).

Vad jag står fast på är hur man skriver de enskilda "callene" utan en "with statement".

Tips mottas med tacksamhet
Citera
2020-09-17, 20:03
  #2
Moderator
vhes avatar
Det beror ju helt på API:t. with-statements finns av en anledning, och de löser problem som du annars måste lösa själv om du inte använder dem.

Det är möjligt att returvärdena från det du anropar i ditt with-statement går att använda rakt av, dock, like so:

Kod:
circuit = tor.create_circuit(5)
stream = circuit.create_stream(("ifconfig.me",80))
stream.send(b'GET / HTTP/1.0\r\nHost: ifconfig.me\r\n\r\n')

...men som sagt, då har du ju, till skillnad från innan, bara skrivit halva programmet. Nu måste du se till att stänga din stream och din circuit (vad det nu är) själv, samt även se till att det blir gjort om det kastas ett fel mitt i koden. Så.. varför helt enkelt inte använda with-statement från början?
Citera
2020-09-17, 20:15
  #3
Medlem
Ok. Poeng tagen.

Är bara att jag inte har kommit till den biten med att förstå/bruka with statements än.

Var därför jag frågade.

Tackar för svaret
Citera
2020-09-17, 20:26
  #4
Moderator
vhes avatar
Citat:
Ursprungligen postat av Dinero
Är bara att jag inte har kommit till den biten med att förstå/bruka with statements än.

Syftet med dem är att det är något i slutet på dem som "måste" göras, och då ser with-statement till att detta görs automatiskt. Det enklaste exemplet är en fil. Den behöver öppnas, läsas från (eller skrivas till) och sedan stängas. Det kan göras på två olika sätt:
Kod:
f = open('fil.txt')
data = f.read()
f.close()

eller
Kod:
with open('fil.txt') as f:
    data = f.read()

De två ovanstående blocken är i normalfallet helt ekvivalenta men det andra är en rad kortare, vilket är smidigt. close() kommer anropas automatiskt i filen när with-blocket avslutas.
Det som skiljer dem åt funktionsmässigt är att om det kastas ett undantag mellan open och close i det första blocket, så kommer close-anropet aldrig göras, och filen kan i teorin vara öppen till programmet avslutas (detta är helt klart en sanning med modifikation, men förenklat, och i teorin så är det så). Det är ett slöseri med resurser (öppna filhandtag) som i sin tur kan bli ett problem i ett stort och komplicerat program.

I ditt exempel med Tor ovan är circuits (som jag helt ärligt inte vet riktigt vad det är) och streams också objekt som behöver ha lite uppstädning gjorda i sig när man är färdig med dem. Så alternativet till att använda with-satser är då att anropa close() eller något liknande i slutet på funktionen. Men då har du åter igen samma problem som med filen, i händelse av att det kastas ett undantag.
Citera
2020-09-17, 20:28
  #5
Medlem
Tack för svaret Vhe
Citera
2022-07-08, 08:28
  #6
Medlem
0xgh64s avatar
Varför inte fixa en tor client som kör allt igenom localhost:9050
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback