meerdere uitspraken gevonden tijdens het samenstellen van een enkele verklaring [DUPLICEER]

Ik ben gloednieuw bij het programmeren. Ik gebruik de duik in het Python-boek en probeer het eerste voorbeeld te rennen, humansize.py. Ik heb de code gekopieerd en geplakt in inactief, de Python Shell en blijf met dezelfde syntaxisfout komen: “Meerdere verklaringen gevonden tijdens het compileren van een enkele verklaring.”

Ik download de code in BBEDIT en kopieer en plakte het in niet-actief. Ik heb er online gekeken en mensen zeiden dat het een tab van het tabblad versus ruimte zou kunnen zijn. Maar ik heb de code doorgemaakt en het ziet er identiek uit naar het boek, ik heb zelfs 4 ruimtes in alle regels van de code verwijderd en opnieuw ingeschakeld en ik krijg nog steeds de fout.

Het is frustrerend omdat ik zeker weet dat het een simpele kwestie is, maar ik heb alles gedaan wat ik ken, (in termen van proberen het probleem te onderzoeken) om het aan het werk te krijgen. Als het een spatie versus lipje is, weet u een van jullie waar ik kan gaan en leert hoe u het proces van het kopiëren en de code inactief inactief kunt invoeren? Ik ben een echte beginner.

Ik zou alle hulp van de gemeenschap waarderen. Bedankt!

Ik loop een Mac OSX – V.10.7.5. Ik gebruik de nieuwste versie van de duik in Python Book en Python 3.3.

De code is hieronder:

>>> '''Convert file sizes to human-readable form.
    Available functions:
    approximate_size(size, a_kilobyte_is_1024_bytes)
    takes a file size and returns a human-readable string
Examples:
>>> approximate_size(1024)
    '1.0 KiB'
>>> approximate_size(1000, False)
    '1.0 KB'
    '''
    SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
            1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
    def approximate_size(size, a_kilobyte_is_1024_bytes=True):
    '''Convert a file size to human-readable form.
    Keyword arguments:
    size -- file size in bytes
    a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
                                if False, use multiples of 1000
    Returns: string
    '''
    if size < 0:
        raise ValueError('number must be non-negative')
    multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
    for suffix in SUFFIXES[multiple]:
        size /= multiple
        if size < multiple:
            return '{0:.1f} {1}'.format(size, suffix)
    raise ValueError('number too large')
    if __name__ == '__main__':
    print(approximate_size(1000000000000, False))
    print(approximate_size(1000000000000))
**SyntaxError: multiple statements found while compiling a single statement**
>>> 

Antwoord 1, Autoriteit 100%

U hebt een paar inkepingsproblemen. In Python is inspringing erg belangrijk, omdat de tolk gebruik maakt van de inkepingsniveaus om te beslissen hoe de verklaringen kunnen worden verwerkt. Bijvoorbeeld:

if (False):
    print("Hello")
print("World")

De verklaring (en) gegroepeerd met de als (false) verklaring mag nooit worden uitgevoerd omdat (false) nooit waar moet zijn. Maar het voorbeeld dat ik je gaf, zal nog steeds “World” uitvoeren. Dit komt omdat de tolk niet de tweede afdrukoverzicht ziet als een deel van de IF-verklaring. Nu als ik de exact dezelfde code zou moeten nemen en de tweede afdrukverklaring als SO zou inspringen:

if (False):
    print("Hello")
    print("World")

De tolk zal zien dat beide afdrukafschriften één inspringniveau zijn dieper dan de IF-verklaring en niets zal worden uitgevoerd omdat als (false) altijd onwaar is.

Dezelfde inspringing is van toepassing op functiedefinities. Bijvoorbeeld:

def foo():
    if(True):
        print("Hello, World")

Omdat de if-instructie een niveau dieper is ingesprongen dan de definitie van foo, is deze gegroepeerd met de foo-functie. Dus als je de foo-functie aanroept, wordt “Hello, World” weergegeven.

Nu voor variabelen. In je code heb je de variabele op één niveau ingesprongen. Wat prima zou zijn als het een onderdeel zou zijn van een functiedefinitie, if-statement, for-lus, enz. Maar aangezien dat niet zo is, levert het problemen op. Neem bijvoorbeeld het volgende:

   a="Hello, World"
if(True):
    print(a)

Geeft u een syntaxis- of inspringfout, terwijl:

a="Hello, World"
if(True):
    print(a)

Zal “Hallo wereld” afdrukken.

Nu focussen op uw code:

  SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
        1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}

Moet één niveau worden verwijderd om te worden:

SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
        1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}

Ook:

   def approximate_size(size, a_kilobyte_is_1024_bytes=True):

Moet één niveau worden verwijderd om te worden:

def approximate_size(size, a_kilobyte_is_1024_bytes=True):

En:

if __name__ == '__main__':
print(approximate_size(1000000000000, False))
print(approximate_size(1000000000000))

Moet zijn:

if __name__ == '__main__':
    print(approximate_size(1000000000000, False))
    print(approximate_size(1000000000000))

Gooi dit allemaal bij elkaar en je krijgt:

SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
        1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
    '''Convert a file size to human-readable form.
    Keyword arguments:
    size -- file size in bytes    
    a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
                            if False, use multiples of 1000
    Returns: string
    '''
    if size < 0:
        raise ValueError('number must be non-negative')
    multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
    for suffix in SUFFIXES[multiple]:
        size /= multiple
        if size < multiple:
            return '{0:.1f} {1}'.format(size, suffix)
    raise ValueError('number too large')
if __name__ == '__main__':
    print(approximate_size(1000000000000, False))
    print(approximate_size(1000000000000))

Ik hoop dat dit helpt!

Other episodes