LINUX.ORG.RU
ФорумTalks

Строчная подстановка в Питоне

 моща


0

2

А вы знали, что в Питоне, начиная с 3.6 вместо:

'1 + 3 = {}'.format(1+3)

можно писать:

f'1 + 3 = {1 + 3}'

Я только что узнал об этом от друга, который проходит курс о Питоне. Вот она, моща Питона во всей красе! Разве можно такую фичу представить в C++? Ну не реально же!

★★★★★

Последнее исправление: seiken (всего исправлений: 1)

Ответ на: комментарий от theNamelessOne

А как f-строки помогают с производительностью? Разве это не просто синтаксический сахар над конкатенацией?

Теоретически интерполяцию можно сделать за одно выделение памяти, а вот для конкатенации, если в языке нет оптимизатора, то нужно сначала выделять память для мелких частей а потом из них собирать финальную.

goingUp ★★★★★
()

f строки одно из самых приятных нововведений в питон. В c# аналог тоже есть, но более куцый. Это когда перед строкой стоит $. Объясню чем более куцый - например с ресурсами не работает и не сработает без очень большого количества извращений. Т.е. такую строку переводить проблемно.

peregrine ★★★★★
()
Ответ на: комментарий от Flotsky

А я использую такое когда jupiter-ом обмазаться хочется чтоб что-то проверить/посчитать. Вне этого подхода это дурное

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от no-such-file

В любом языке такие вещи в продакшене делаются на темплейт-движках с поддержкой интернационализации в т.ч. согласованием по числительным.

Дядь хочу в твою вселенную. Вот берём c# у меня надо переводить такое (вариант упрощён) «в коллекции хранятся {numberOfElements} красивых бутылок». Как сделать нормально для произвольных языков? Чтоб не только бутылка склонялось правильно но и красивых тоже склонялось ну и про хранятся не забывать тоже? А то пока один ужас вижу, на фоне которого идея о формате который хранит данные + код для перевода выглядит очень здравой, чтоб туда писать все подстановки под язык в зависимости от условий переменных (numberOfElements в данном случае). Можешь в своём ЯП назвать как это делается.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от Puzan

За такое надо по рукам бить чтоб их больше не писали никогда. У меня от лямбд многострочных такое же ощущение как от многострочных регулярок, хотя регулярки всё же предпочтительнее. Смотри как просто

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*))*)?;\s*)
ps

Регулярка реальна и делает полезную работу - проверяет email адрес на соответствие rfc. Ну если автор не наврал.

PPS Perl

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 3)
Ответ на: комментарий от seiken

Тогда write-only стиль перл мощнее мощного. Может, хватит мощи, больше читаемости?

Shadow ★★★★★
()
Ответ на: комментарий от peregrine

как от многострочных регулярок

Чушь сморозил

У меня от лямбд многострочных такое же ощущение как от многострочных регулярок

Чем по-твоему функция отличается от многострочной лямбды? Или у тебя и от многострочных функций головокружения? До чего людей доводит питон 😱

Puzan ★★★★★
()
Ответ на: комментарий от Puzan

тем что лямбды нихрена не читаемы? Что переменные там обычно называют ущербно, что комментарий внутрь не напишешь. И выходит говно вида

rgenkeys = lambda s=2048, e=65537: ((lambda obj1, obj2: (obj1, obj2.public_key()))(*((lambda obj: (obj, obj))(rsa.generate_private_key(public_exponent=e, key_size=s)))))

peregrine ★★★★★
()
Ответ на: комментарий от Puzan

До чего людей доводит питон 😱

Питон – это ЯП для людей с отсутствием хорошего вкуса.

wandrien ★★
()
Ответ на: комментарий от peregrine

И выходит говно

Потому что язык говно? В нормальных языках и лямбды нормальные.

Puzan ★★★★★
()

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

flant ★★★
()
Ответ на: комментарий от wandrien

Они на любом ЯП такие. Привыкнуть конечно можно, но ты недельку код без лямбд почитай и попиши и потом опять привыкать придётся. Короче на мой вкус лямбды вообще моветон, как и многое из функциональщины. Писать может и короче, но читабельность падает. В любом языке такое. Кстати, это одна из причин почему на лиспе никто серьёзно код не пишет. Вторая конечно скобочки которые его малочитаемым делают, потому как там только 1 вид скобочек массово используется. Можно не соглашаться, но это так, беда лиспа не в производительности, у питона она явно не лучше. Так же и lua никому нафиг не нужна бы была со своими странными решениями в виде нумерации с 1 и того что всё в ней таблица, но увы альтернатив как встраиваемому яп у неё нет в плане простоты встраиваемости и производительности. Если станет v8 так же просто встраивать как lua и документации по его встраиванию разрекламят на всяких реддитах и медиумах, то lua на другой день умрёт.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Что ни предложение, то лол и фейспалм (или как там это сейчас у молодёжи называется?).

Например:

Короче на мой вкус лямбды вообще моветон, как и многое из функциональщины.

Лол.

это одна из причин почему на лиспе никто серьёзно код не пишет

Фейспалм.

Вторая конечно скобочки

Лол.

Ну и т.д.

Puzan ★★★★★
()
Ответ на: комментарий от peregrine

Короче на мой вкус лямбды вообще моветон, как и многое из функциональщины.

При чем тут функциональщина? Лямбда это тупо безымянная функция. Именованные функции – это тоже функциональщина?

Возбухать на лямбды всё равно что возбухать на арифметические выражения. Давайте запретим в языке неименованные выражения. Ну а чо?

Ведь кто-то может написать (и каждый день пишет) выражения размером в 3-4 экранных строки и «портит читаемость».

wandrien ★★
()
Ответ на: комментарий от Puzan

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

peregrine ★★★★★
()
Ответ на: комментарий от wandrien

Возбухать на лямбды всё равно что возбухать на арифметические выражения.

А ты код который математики пишут видел? Там как раз арифметики много и геометрией отдаёт с a b c d переменными, вот только в проду его потом переписывают почему-то.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от wandrien

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

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Возможно стоит заменть его на то что ты вообще IT в глаза не видел?

Мва-ха-ха. Понятно теперь, какой ты специалист по ИБ. Такой же, как и по программированию :))

Короче регай новый аккаунт

Ты постишь тупняк, а мне новый аккаунт регать? Ничё, у тебя ЧСВ :)

Puzan ★★★★★
()
Ответ на: комментарий от seiken

Питоновская фича похожа на подстановку команд в шелле. Это то, что делает шелл мощнейшим скриптовым ЯП.

В шелл

"`hernya "$abyrvalg" | drugaya_hernya`"

— это единственный способ хоть как-то работать с данными.

В нормальных ЯП для этого есть развитые структуры данных.

Питон хоть и сделан людьми без вкуса, но всё-таки относится к ведомству «нормальных ЯП», и дрочего со строками там не востребовано.

Шелл как мощнейший скриптовый ЯП — это отдельный РОФЛ. Даже не знаю, как это прокомментировать.

Единственным преимуществом POSIX шелла является то, что он скомпилирован под любой калькулятор.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

что за детсад вы тут развели?

seiken ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Сразу видно в девелопмент вы не заглядываете с пузаном, в гитхаб тоже не ходите, там тоже ужаса много…

Что ни предложение, то лол и фейспалм (или как там это сейчас у молодёжи называется?). (c)

wandrien ★★
()
Ответ на: комментарий от wandrien

Понимаю... В игнор пожалуй тоже, третий ваш друг молчит который про системы перевода брякнул, интересно ответит ли или тоже будет щёки с умным видом надувать?

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Все вокруг дураки и не лечатся, одна я в белом платье стою красивая.

Пять звёзд как обычно не подводят.

wandrien ★★
()
Ответ на: комментарий от Irma

Три, ещё есть printf-подобное форматирование:

print('%d is %s' % (42, 'qwe'))
ad0c
()
Ответ на: комментарий от peregrine

в коллекции хранятся {numberOfElements} красивых бутылок». Как сделать нормально для произвольных языков?

Это даже тупорылый gettext может.

no-such-file ★★★★★
()
Ответ на: комментарий от peregrine

в девелопмент вы не заглядываете

Зачем мне треды по питону? Или ты думаешь, что кроме питона жизни нет?

Puzan ★★★★★
()

пфф...

$ :(){ echo $@=$(($@)); }
$ : 1+2
1+2=3

superuser ★★★★☆
()
Ответ на: комментарий от Puzan

Или ты думаешь, что кроме питона жизни нет?

Конечно, есть. Но с ним она слаще :)

seiken ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Так эта регулярка там же в RFC и есть. Кто-то километровую спагеттину 20 лет назад написал, а переписать ее никто не осилил. За что по рукам бить? Такое лучше?

def check_email(s: str) -> bool:
  return s.count('@') == 1

Или код паскальщиков с перебором всех символов?

rtxtxtrx
()

Можно еще вот так:

>>> f'{0.1 + 0.2=:.1f}'
'0.1 + 0.2=0.3'
rtxtxtrx
()
Ответ на: комментарий от rtxtxtrx

На самом деле почитай конкретно этот rfc если хочется что-то умное по теме сказать и почитай почему на него болт сверху положен большинством софтописателей. Но если коротко то твой вариант даже для положивших болт не годен.

peregrine ★★★★★
()
Ответ на: комментарий от no-such-file

Ну во-первых не тупорылый, а один из промышленных стандартов перевода как раз которых раз два и нету, во-вторых нет, не умеет (если не подставлять костылики), если ты его с ngettext-ом не путаешь который как раз из-за этого и сделали в .net хотя ребятки из mono и гнома портировали оригинальный раньше. В третьих, в том же коде на сишке в проектах типа cdda (где реально много текста переводится - 50 000 строчек, вроде последнее что я видел там по переводу) gettext используют патченный и форкнутый по той же самой причине.

peregrine ★★★★★
()
Ответ на: комментарий от Irma

Одно время мы шутили, что продадим это Советам, чтобы отбросить их прогресс в области информатики на 20 или более лет назад.

Теперь всё встало на свои места. 😒 Первый раз эту шнягу прочитал...

xwicked ★★☆
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)