Python-code analyseren: Modulus-operator

Ik keek naar een code in Python (ik weet niets over Python) en ik kwam dit gedeelte tegen:

def do_req(body):
    global host, req
    data = ""
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, 80))
    s.sendall(req % (len(body), body))
    tmpdata = s.recv(8192)
    while len(tmpdata) > 0:
        data += tmpdata
        tmpdata = s.recv(8192)
    s.close()
    return data

Dit wordt dan later gecalld met een enorme body, zoals in meer dan 500.000 bytes. Dit wordt verzonden naar een Apache-server met de maximale aanvraaggrootte op de standaard 8190 bytes.

Mijn vraag is wat er gebeurt in het deel " s.sendall() ? Uiteraard kan het hele lichaam niet meteen worden verzonden en ik vermoed dat het wordt gereduceerd door middel van de modulus-operator. Ik weet echter niet hoe het in Python werkt. Kan iemand het uitleggen? Bedankt.

0

2 antwoord

Het is niet echt de modulus-operator (technisch gezien is het omdat strings gewoon __ mod__ implementeren ) maar de python2-stijl tekenreeksopmaakoperator .

Gegeven formaat% waarden (waarbij formaat een string of Unicode-object is), % conversiespecificaties in -formaat worden vervangen door nul of meer elementen van waarden . Het effect is vergelijkbaar met het gebruik van sprintf() in de C-taal.

Het is duidelijk dat het hele lichaam niet tegelijk kan worden verzonden

Hoewel het inderdaad niet past in een enkel pakket dat een low-level ding is dat intern wordt behandeld (waarschijnlijk niet eens door python maar door de onderliggende syscall die naar een socket schrijft)

7
toegevoegd
@Lattyware: waar, maar omwille van de eenvoud/beknoptheid % verslaat .format()
toegevoegd de auteur ThiefMaster, de bron
Het is vermeldenswaard dat in nieuwe code, in plaats van dit te gebruiken, je waarschijnlijk de voorkeur zou moeten geven aan de nieuwere, krachtigere str.format() -functie .
toegevoegd de auteur Gareth Latty, de bron
@ThiefMaster I for one (persoonlijke houding, niet de standpunten van de Python-ontwikkelaars vanaf deze tijd) zijn van mening dat de formattering % moet worden beëindigd - om de Zen van Python te citeren er zou er een moeten zijn - - en bij voorkeur slechts één - voor de hand liggende manier om het te doen. , het is ook een speciaal geval - ik voel dat een functie hier natuurlijker is. Natuurlijk, ik weet zeker dat ik een antwoord krijg met functionaliteit beats zuiverheid , wat waar is, ik zie gewoon niet echt het voordeel van de oude stijl - beknoptheid is gewoon niet belangrijk genoeg om het speciale geval te rechtvaardigen. Uiteraard zijn beide vanaf het moment in de nabije toekomst nog steeds aanwezig.
toegevoegd de auteur Gareth Latty, de bron
Wel, het is de modulus-operator, maar het heeft een specifieke betekenis als de LH een tekenreeks is.
toegevoegd de auteur Ignacio Vazquez-Abrams, de bron

Nee, het lichaam wordt hier niet gereduceerd, omdat% formaatoperator is, wanneer op tekenreeksen wordt gewerkt.

http://docs.python.org/release/2.5.2 /lib/typesseq-strings.html

Alle gegevens worden per sendall-methode verzonden per onderdeel.

socket.sendall werkt zo:

do {
        n = sendsegmented(s->sock_fd, buf, len, flags);
        len -= n;
} while (len > 0);

waar sendsegment gegevens verzendt en len of SEGMENT_SIZE retourneert

0
toegevoegd