سؤال

أنا أستخدم شيئا مشابها إلى البرنامج النصي المبسط التالي لتحليل المقتطفات من Python من ملف أكبر:

import io
import tokenize

src = 'foo="bar"'
src = bytes(src.encode())
src = io.BytesIO(src)

src = list(tokenize.tokenize(src.readline))

for tok in src:
  print(tok)

src = tokenize.untokenize(src)

على الرغم من أن القانون ليس هو نفسه في Python2.x، فإنه يستخدم نفس المصطلح ويعمل على ما يرام. ومع ذلك، تشغيل المقتطف أعلاه باستخدام Python3.0، أحصل على هذا الإخراج:

(57, 'utf-8', (0, 0), (0, 0), '')
(1, 'foo', (1, 0), (1, 3), 'foo="bar"')
(53, '=', (1, 3), (1, 4), 'foo="bar"')
(3, '"bar"', (1, 4), (1, 9), 'foo="bar"')
(0, '', (2, 0), (2, 0), '')

Traceback (most recent call last):
  File "q.py", line 13, in <module>
    src = tokenize.untokenize(src)
  File "/usr/local/lib/python3.0/tokenize.py", line 236, in untokenize
    out = ut.untokenize(iterable)
  File "/usr/local/lib/python3.0/tokenize.py", line 165, in untokenize
    self.add_whitespace(start)
  File "/usr/local/lib/python3.0/tokenize.py", line 151, in add_whitespace
    assert row <= self.prev_row
AssertionError

لقد بحثت عن إشارات إلى هذا الخطأ وأسبابه، ولكن لم تتمكن من العثور على أي. ماذا أفعل الخطأ وكيف يمكنني تصحيحه؟

تعديل

بعد Partisannتتسبب ملاحظة الملاحظة التي تؤدي إلى إلحاق جديد إلى المصدر بالعثور على الخطأ، بدأت العبث بالقائمة التي كنت أقوم بها. يبدو أن EOF يتسبب الرمز المميز في خطأ إذا لم يسبق مباشرة بواسطة Newline، فقم بإزالة هذا الخطأ. يعمل البرنامج النصي التالي دون خطأ:

import io
import tokenize

src = 'foo="bar"'
src = bytes(src.encode())
src = io.BytesIO(src)

src = list(tokenize.tokenize(src.readline))

for tok in src:
  print(tok)

src = tokenize.untokenize(src[:-1])
هل كانت مفيدة؟

المحلول

src = 'foo="bar"\n'
لقد نسيت نيولين.

نصائح أخرى

إذا قمت بالحد من المدخلات إلى untokenize إلى أول عنصرين من الرموز، يبدو أن العمل.

import io
import tokenize

src = 'foo="bar"'
src = bytes(src.encode())
src = io.BytesIO(src)

src = list(tokenize.tokenize(src.readline))

for tok in src:
  print(tok)

src = [t[:2] for t in src]
src = tokenize.untokenize(src)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top