Kai bandau naudoti spausdinti
teiginį "Python" programoje, gaunu šią klaidą:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: Missing parentheses in call to 'print'
Ką tai reiškia?
Šis klaidos pranešimas reiškia, kad bandote naudoti "Python 3", norėdami sekti pavyzdį arba paleisti programą, kurioje naudojama "Python 2" print
komanda:
print "Hello, World!"
Pirmiau pateiktas teiginys neveikia Python 3. Python 3 programoje aplink spausdintiną reikšmę reikia pridėti skliaustelius:
print("Hello, World!")
"SyntaxError: Sunkieji skliaustai skambutyje 'print' " - tai naujas klaidos pranešimas, kuris buvo pridėtas į "Python 3.4.2", visų pirma siekiant padėti vartotojams, kurie bando sekti "Python 2" vadovėlį, o naudoja "Python 3".
Python 3 versijoje verčių spausdinimas iš atskiro teiginio tapo paprastu funkcijos iškvietimu, todėl dabar reikia skliaustų:
>>> print("Hello, World!")
Hello, World!
Ankstesnėse "Python 3" versijose vertėjas tiesiog pranešdavo apie bendrą sintaksės klaidą, nepateikdamas jokių naudingų užuominų, kas gali būti negerai:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: invalid syntax
Kodėl "Python 3" print
tapo įprasta funkcija, tai susiję ne su pagrindine teiginio forma, o su tuo, kaip atlikti sudėtingesnius dalykus, pavyzdžiui, spausdinti kelis elementus į "stderr" su tarpu, o ne užbaigti eilutę.
Python 2:
>>> import sys
>>> print >> sys.stderr, 1, 2, 3,; print >> sys.stderr, 4, 5, 6
1 2 3 4 5 6
Python 3:
>>> import sys
>>> print(1, 2, 3, file=sys.stderr, end=" "); print(4, 5, 6, file=sys.stderr)
1 2 3 4 5 6
Nuo 2017 m. rugsėjo mėn. išleistos "Python 3.6.3" versijos kai kurie su "Python 2.x" spausdinimo sintakse susiję klaidų pranešimai buvo atnaujinti, kad būtų rekomenduojami jų "Python 3.x" atitikmenys:
>>> print "Hello!"
File "<stdin>", line 1
print "Hello!"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?
Kadangi "Missing parentheses in call to print" atvejis yra kompiliavimo laiko sintaksės klaida, taigi turi prieigą prie neapdoroto pradinio kodo, jis'gali įtraukti visą likusios eilutės tekstą į siūlomą pakeitimą. Tačiau šiuo metu ji nebando nustatyti, kokias kabutes reikia dėti aplink šią išraišką (tai nėra neįmanoma, tik pakankamai sudėtinga, todėl tai nebuvo padaryta).
Taip pat buvo pritaikyta TypeError
klaida, iškeliama dėl dešiniojo poslinkio operatoriaus:
>>> print >> sys.stderr
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and '_io.TextIOWrapper'. Did you mean "print(<message>, file=<output_stream>)"?
Kadangi ši klaida iškeliama kodo vykdymo metu, o ne jį kompiliuojant, ji neturi prieigos prie pirminio kodo, todėl siūlomoje pakeitimo išraiškoje naudojami metakintamieji (<message>
ir <output_stream>
), o ne tai, ką vartotojas iš tikrųjų įvedė. Skirtingai nei sintaksės klaidos atveju, įprastiniame dešiniojo poslinkio klaidos pranešime aplink Python išraišką nesudėtinga pateikti kabutes.
Iš "Python 2" į "Python 3" pasikeitė sintaksė. Python 2,
print "Hello, World!"
veiks, bet Python 3 programoje reikia naudoti skliaustelius kaip
print("Hello, World!")
Tai yra lygiavertė sintaksė Scala ir artima Java.