Ошибка определения токена в спецификаторе формата нового стиля - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующая строка в переменной jss.

jss = '''
Java.perform(
  function()
  {
    var item = Java.use("java.util.Random"); 
    console.log("HOOKING random");
    item.nextInt.overload("int").implementation = function(a)
    {
      var ret = this.nextInt(a); 
      return {0};
    }
  }
);
'''.format("1234")

, и я пытаюсь использовать спецификатор формата, чтобы просто передать ему некоторое значение (в данном случае «1234»).

Когда я пытаюсь запустить это в iPython, я получаю следующую ошибку:

ERROR:root:An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line string', (1, 0))

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-1-a900f760c449> in <module>()
     12   }
     13 );
---> 14 '''.format("1234")

KeyError: '\n    var item = Java'

Не уверен, что здесь происходит не так.Может кто-нибудь, пожалуйста, помогите понять?

1 Ответ

0 голосов
/ 02 октября 2018

вам нужно экранировать другие фигурные скобки с помощью {{ и }} - в противном случае токенизатор формата python захочет разобраться в паттерне.(протестировано только в python3 ...)

jss = '''
Java.perform(
  function()
  {{
    var item = Java.use("java.util.Random"); 
    console.log("HOOKING random");
    item.nextInt.overload("int").implementation = function(a)
    {{
      var ret = this.nextInt(a); 
      return {0};
    }}
  }}
);
'''.format("1234")

при условии, что скобки, которые вы не хотите использовать, поскольку параметрам форматирования всегда предшествует более одного пробела (а скобкам форматирования предшествует не более одного пробела)) вы можете заменить их:

import re 

# with your original jss
sanitized = re.sub('(\s\s+){', r'\1{{', jss)
sanitized = re.sub('(\s\s+)}', r'\1}}', sanitized)

print(sanitized.format("1234"))

... может быть гораздо более разумные регулярные выражения в соответствии с вашими потребностями ...

...