Get str repr с двойными кавычками Python

Всегда стоит сделать что-то твердый путь - однажды - как осуществление изучения. Как только Вы понимаете, как это работает, выберите платформу, которая удовлетворяет Вашему приложению, и используйте это. Вы не должны перестраивать колесо, как только Вы понимаете угловую скорость.:-)

также стоит удостовериться, что у Вас есть довольно устойчивое понимание языка программирования позади платформы прежде , Вы вскакиваете - пытающийся изучить и Django и Python одновременно (или Ruby, и направляющие или X и Y), может привести еще к большему количеству беспорядка. Запишите некоторый код на языке сначала, затем добавьте платформу.

Мы учимся разрабатывать, не при помощи инструментов, а путем решения проблем. Столкнутый несколько стен, поднимитесь и найдите некоторые более высокие стены!

13
задан Community 23 May 2017 в 11:54
поделиться

3 ответа

repr () - это не то, что вам нужно. Существует фундаментальная проблема: repr () может использовать любое представление строки, которое может быть оценено как Python, для создания строки. Теоретически это означает, что он может решить использовать любое количество других конструкций, которые недопустимы в C, например, "" "длинные строки" "".

Этот код, вероятно, является правильным направлением. Я использовал значение по умолчанию для переноса на 140, что является разумным значением для 2009 года, но если вы действительно хотите перенести свой код на 80 столбцов, просто измените его.

Если unicode = True, он выводит L "широкую" строку, которая может значимо хранить escape-последовательности Unicode. В качестве альтернативы вы можете преобразовать символы Unicode в UTF-8 и вывести их с экранированием, в зависимости от программы, в которой вы их используете.

def string_to_c(s, max_length = 140, unicode=False):
    ret = []

    # Try to split on whitespace, not in the middle of a word.
    split_at_space_pos = max_length - 10
    if split_at_space_pos < 10:
        split_at_space_pos = None

    position = 0
    if unicode:
        position += 1
        ret.append('L')

    ret.append('"')
    position += 1
    for c in s:
        newline = False
        if c == "\n":
            to_add = "\\\n"
            newline = True
        elif ord(c) < 32 or 0x80 <= ord(c) <= 0xff:
            to_add = "\\x%02x" % ord(c)
        elif ord(c) > 0xff:
            if not unicode:
                raise ValueError, "string contains unicode character but unicode=False"
            to_add = "\\u%04x" % ord(c)
        elif "\\\"".find(c) != -1:
            to_add = "\\%c" % c
        else:
            to_add = c

        ret.append(to_add)
        position += len(to_add)
        if newline:
            position = 0

        if split_at_space_pos is not None and position >= split_at_space_pos and " \t".find(c) != -1:
            ret.append("\\\n")
            position = 0
        elif position >= max_length:
            ret.append("\\\n")
            position = 0

    ret.append('"')

    return "".join(ret)

print string_to_c("testing testing testing testing testing testing testing testing testing testing testing testing testing testing testing testing testing", max_length = 20)
print string_to_c("Escapes: \"quote\" \\backslash\\ \x00 \x1f testing \x80 \xff")
print string_to_c(u"Unicode: \u1234", unicode=True)
print string_to_c("""New
lines""")
4
ответ дан 1 December 2019 в 21:53
поделиться

Если вы запрашиваете у python str его repr , я не думаю, что тип цитаты действительно настраивается. Из функции PyString_Repr в исходном дереве python 2.6.4:

    /* figure out which quote to use; single is preferred */
    quote = '\'';
    if (smartquotes &&
        memchr(op->ob_sval, '\'', Py_SIZE(op)) &&
        !memchr(op->ob_sval, '"', Py_SIZE(op)))
        quote = '"';

Итак, я предполагаю использовать двойные кавычки, если в строке есть одинарные кавычки, но даже не тогда, если есть двойные цитата в строке.

Я бы попробовал написать собственный класс, содержащий строковые данные, вместо того, чтобы использовать для этого встроенную строку. Один из вариантов - создать класс из str и написать свой собственный repr :

class MyString(str):
    __slots__ = []
    def __repr__(self):
        return '"%s"' % self.replace('"', r'\"')

print repr(MyString(r'foo"bar'))

Или вообще не использовать repr :

def ready_string(string):
    return '"%s"' % string.replace('"', r'\"')

print ready_string(r'foo"bar')

This упрощенное цитирование может не дать «правильного» результата, если в строке уже есть экранированная кавычка.

7
ответ дан 1 December 2019 в 21:53
поделиться

Лучше не взламывать repr ( ) , но используйте правильную кодировку с самого начала. Вы можете получить кодировку repr напрямую с помощью кодировки string_escape

>>> "naïveté".encode("string_escape")
'na\\xc3\\xafvet\\xc3\\xa9'
>>> print _
na\xc3\xafvet\xc3\xa9

Для экранирования кавычек "я думаю, что использование простой замены после escape-кодирования строки является полностью однозначным процессом:

>>> '"%s"' % 'data:\x00\x01 "like this"'.encode("string_escape").replace('"', r'\"')
'"data:\\x00\\x01 \\"like this\\""'
>>> print _
"data:\x00\x01 \"like this\""
7
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: