Java, эквивалентный из Python repr ()?

Чье-то имя или инициалы, и вот именно. Иногда эти подписи определяют блок кода...

//SFD Start
...code...
//SFD End

Как код такое произведение искусства, они должны подписать его! Плюс, что, если кто-то еще должен изменить код, отметило этот путь?

Это не должно быть перепутано с "виной" или "аннотировать" функцию в системах управления исходным кодом - они качаются!

23
задан Ian Dalton 21 May 2012 в 18:36
поделиться

6 ответов

В некоторых проектов, я использую следующую вспомогательную функцию для выполнения чего-то похожего на Python repr для строк:

private static final char CONTROL_LIMIT = ' ';
private static final char PRINTABLE_LIMIT = '\u007e';
private static final char[] HEX_DIGITS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

public static String toPrintableRepresentation(String source) {

    if( source == null ) return null;
    else {

        final StringBuilder sb = new StringBuilder();
        final int limit = source.length();
        char[] hexbuf = null;

        int pointer = 0;

        sb.append('"');

        while( pointer < limit ) {

            int ch = source.charAt(pointer++);

            switch( ch ) {

            case '\0': sb.append("\\0"); break;
            case '\t': sb.append("\\t"); break;
            case '\n': sb.append("\\n"); break;
            case '\r': sb.append("\\r"); break;
            case '\"': sb.append("\\\""); break;
            case '\\': sb.append("\\\\"); break;

            default:
                if( CONTROL_LIMIT <= ch && ch <= PRINTABLE_LIMIT ) sb.append((char)ch);
                else {

                    sb.append("\\u");

                    if( hexbuf == null ) 
                        hexbuf = new char[4];

                    for( int offs = 4; offs > 0; ) {

                        hexbuf[--offs] = HEX_DIGITS[ch & 0xf];
                        ch >>>= 4; 
                    }

                    sb.append(hexbuf, 0, 4);
                }
            }
        }

        return sb.append('"').toString();
    }
}

Ее главное преимущество перед многими другими решениями, приведенными здесь, заключается в том, что она не фильтрует только ограниченный набор непечатаемые символы (например, те, которые заменяют решения на основе ), а просто все непечатаемые символы ASCII. Некоторые из них можно было бы написать немного лучше, но они действительно выполняют свою работу ...

Обратите внимание, что, как и функция Python, этот будет заключать строку в кавычки. Если вы этого не хотите, вам придется исключить вызовы append ('"') до и после цикла while .

8
ответ дан 29 November 2019 в 03:03
поделиться

Это сработает, но это немного похоже на взлом, он использует StringUtils и replaceEach из Common Lang для простой замены:

String hello = "hello\n\tworld\n\n\t";       
        String replaced = StringUtils.replaceEach(hello, new String[] {"\n", "\t", "\r", "\f"}, 
                                                         new String[] {"\\n", "\\t", "\\r", "\\f"});
        System.out.println("Replaced " + replaced);
1
ответ дан 29 November 2019 в 03:03
поделиться

не думаю, что есть какой-то конкретный метод, но это решит его без общего языка:

public class test {

public test() throws Exception {
    byte[] hello = "hello\n\tworld\n\n\t".getBytes();
    System.out.println(new String(hexToByte(stringToHex(hello).replaceAll("0a", "5c6e")
                                                              .replaceAll("09", "5c74"))));
}

public static void main(String[] args) throws Exception {
    new test();
}

public static String stringToHex(byte[] b) throws Exception {
    String result = "";
    for (int i = 0; i < b.length; i++) {
        result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
    }
    return result;
}

public static byte[] hexToByte(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
    }
    return data;
}

}

1
ответ дан 29 November 2019 в 03:03
поделиться

Если вы собираетесь использовать это только для строк, в крайнем случае вы могли бы просто написать метод, который перебирает строку и заменяет специальные символы (для любого определения "особого", которое вы хотите) их коды выхода. Я бы так и поступил. (Я провел быстрый поиск и ничего не нашел в Google, так что, возможно, будет быстрее просто написать метод, чем искать существующую реализацию)

в крайнем случае вы можете просто написать метод, который перебирает строку и заменяет специальные символы (для любого определения «особого», которое вы хотите) их escape-кодами. Я бы так и поступил. (Я провел быстрый поиск и ничего не нашел в Google, так что, возможно, будет быстрее просто написать метод, чем искать существующую реализацию)

в крайнем случае вы можете просто написать метод, который перебирает строку и заменяет специальные символы (для любого определения «особого», которое вы хотите) их escape-кодами. Я бы так и поступил. (Я провел быстрый поиск и ничего не нашел в Google, так что, возможно, будет быстрее просто написать метод, чем искать существующую реализацию)

0
ответ дан 29 November 2019 в 03:03
поделиться

Если бы такой метод существовал, он упростил бы написание quine на Java, потому что он решил бы проблему выхода из кавычек. Поскольку все простейшие quines в Java требуют ручной вставки символа кавычки вручную с его кодом символа, маловероятно, что такой метод существует.

0
ответ дан 29 November 2019 в 03:03
поделиться

Похоже, что Jython уже делает это. Теоретически вы можете включить Jython jar, запустить интерпретатор и фактически запустить repr (объект) для рассматриваемого объекта. Наверное, больше накладных расходов, чем вы хотите, но делает именно то, что вы описываете.

Если вы хотите встроить интерпретатор Jython в свое приложение, рассмотрите http://wiki.python.org/jython/JythonFaq/EmbeddingJython .

0
ответ дан 29 November 2019 в 03:03
поделиться
Другие вопросы по тегам:

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