MessageFormat в JavaScript (параметры в локализованных строках UI)

Действительно ли Вы знакомы с другими функциональными языками? т.е. Вы пытаетесь изучить, как Python делает функциональное программирование, или Вы пытаетесь узнать о функциональном программировании и используете Python в качестве механизма?

кроме того, Вы понимаете понимания списка?

map(f, sequence)

непосредственно эквивалентен (*) к:

[f(x) for x in sequence]

На самом деле, я думаю map(), был когда-то намечен для удаления из python 3.0, как являющегося избыточным (которого не произошло).

map(f, sequence1, sequence2)

главным образом эквивалентно:

[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]

(существует различие в том, как оно обрабатывает случай, где последовательности имеют другую длину. Как Вы видели, map() не заполняет Ни один, когда одна из последовательностей заканчивается, тогда как zip() остановки, когда самая короткая последовательность останавливается)

Так, для обращения к конкретному вопросу Вы пытаетесь привести к результату:

foos[0], bars
foos[1], bars
foos[2], bars
# etc.

Вы могли сделать это путем записи функции, которая берет отдельный аргумент и печатает его, сопровождаемый панелями:

def maptest(x):
     print x, bars
map(maptest, foos)

, С другой стороны, Вы могли создать список, который похож на это:

[bars, bars, bars, ] # etc.

и использование Ваш исходный maptest:

def maptest(x, y):
    print x, y

Один способ сделать, которым это было бы к explicitely, создает список заранее:

barses = [bars] * len(foos)
map(maptest, foos, barses)

, С другой стороны, Вы могли вытянуть в itertools модуль. itertools содержит много умных функций, которые помогают Вам сделать программирование отложенных вычислений функционального стиля в Python. В этом случае мы хотим itertools.repeat, который произведет его аргумент неограниченно долго, поскольку Вы выполняете итерации по нему. Этот последний факт означает это, если Вы делаете:

map(maptest, foos, itertools.repeat(bars))

Вы получите бесконечный вывод, так как map() продолжает идти, целый один из аргументов все еще производит вывод. Однако itertools.imap точно так же, как map(), но останавливается как только самые короткие повторяемые остановки.

itertools.imap(maptest, foos, itertools.repeat(bars))

Hope это помогает:-)

(*), Это немного отличается в python 3.0. Там, карта () по существу возвращает выражение генератора.

21
задан Ovesh 30 August 2009 в 08:10
поделиться

1 ответ

String.prototype.format = function() {
    var args = arguments;

    return this.replace(/\{(\d+)\}/g, function() {
        return args[arguments[1]];
    });
};

// Returns '2 + -1 = 1'.
'{0} + {1} = {2}'.format(2, -1, 1);

Или в соответствии с вашими требованиями:

function replaceParams(string, replacements) {
    return string.replace(/\{(\d+)\}/g, function() {
        return replacements[arguments[1]];
    });

    // Or, if prototype code above...
    String.format.apply(string, replacements);
}

Вы можете добавить причудливые функции i18n, такие как порядковый номер (как бы он ни назывался):

// Not well tested.

i18n.en.filters = {
    ordinal: function(n) {
        // FIXME Doesn't handle all cases.
        switch(('' + n).substr(-1)) {
            case '1':
                return '' + n + 'st';
            case '2':
                return '' + n + 'nd';
            case '3':
                return '' + n + 'rd';
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            case '0':
                return '' + n + 'th';
            default:
                return n; // Just in case...
        }

    },
    plural: function(n, singular, plural) {
        if(n == 1) {
            return singular;
        } else {
            return plural;
        }
    }
};

i18n.current = i18n.en;

String.prototype.format = function() {
    var args = arguments;

    return this.replace(/\{((\d+)((\|\w+(:\w+)*)*))\}/g, function() {
        var arg = args[arguments[2]],
            filters = arguments[3].split('|'),
            i, curFilter, curFilterArgs, curFilterFunc;

        for(i = 0; i < filters.length; ++i) {
            curFilterArgs = filters[i].split(':');
            curFilter = curFilterArgs.shift();
            curFilterFunc = i18n.current.filters[curFilter];

            if(typeof curFilterFunc === 'function') {
                arg = curFilterFunc.apply(null, [ arg ].concat(curFilterArgs));
            }
        }

        return arg;
    });
};

'You have {0} {0|plural:cow:cows} but I have {1} {1|plural:cow:cows}.'.format(2,1);
'My horse came in {0|ordinal} place while yours came in {1|ordinal}.'.format(42,1);
37
ответ дан 29 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

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