Как стать автором
Обновить

Комментарии 38

НЛО прилетело и опубликовало эту надпись здесь
о-ё-ёй, спасибо, вот так ошибка, просмотрел (:
НЛО прилетело и опубликовало эту надпись здесь
Да я знаю, просто комент был всего один, я поторопился и думал что ответить уже нажата, т.к. текстария была снизу (:
PEP 8 (Style Guide for Python Code):

Indentation

Use 4 spaces per indentation level.

For really old code that you don't want to mess up, you can continue to
use 8-space tabs.

Maximum Line Length

Limit all lines to a maximum of 79 characters.
«Канонические» способы проверить тип в питоне:
type(x) is str
isinstance(x, str)

Причём второй метод проверит принадлежность объекта не только к самому классу, но и к inherited классам.
НЛО прилетело и опубликовало эту надпись здесь
Конечно, «лучший способ проверить тип в питоне — не проверять тип». Но в топике автор если и использует подход duck typing, то довольно запутанно, простите.
А-а-а, что я наделал, сказав автору топика про type()… Стало хуже.
НЛО прилетело и опубликовало эту надпись здесь
isinstance(str, basestring);
НЛО прилетело и опубликовало эту надпись здесь
Наверное просто shift не нажал. Кстати basestring fixed (:
Ну простите пожалуйста, очень важно не поставить точку с запятой в комментарии :)
В коде на пистоне я не ставлю, но сегодня я писал на javascript, мозг не переключился.
для разминки предлагаю убрать ";" в следующем коде:

python -c «import os; print 'Current working dir is %s' % os.getcwd()»
НЛО прилетело и опубликовало эту надпись здесь
Why So Serious?

Я конечно же не писал, что это невозможно, или сложно, я всего навсего клоню к тому, что фраза

>> точно мог сказать, что в питоне ";" появляется только в очень кривом коде

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

И я сдаюсь, представить даже не могу чем мой милый on-liner отличается от полноценного кода
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Прекрасно информативный топик и максимально документированный код. Браво.
Вы наверное красьненьким забыли покрасить.

Топик минусанул. И вот почему.

Информативность топика стремится к нулю, к тому же приведенный код является примером того, как не надо писать на питоне. Особенно если ориентирован на новичков.
Несоблюдение PEP8.
Использование исключений в таком виде:
try:
except Exception:
    pass

И в if засунули большой блок кода, хотя можно было поступить более красиво. Вывести справку и выйти.
# translate «hi» en ru

Я бы сделал как минимум два алиаса en2ru и ru2en, чем избавился бы от лишних ключей и от кавычек одновременно
сравните

# translate «hi» en ru

и

# en2ru hi
А еще лучше, чтоб, если направление перевода не указано, то язык слова (русский или английский) автоматом определялся.
Так выглядит чуть лучше, ИМХО:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import re
import urllib
import urllib2
import json

url = "http://translate.google.com/translate_a/t?client=t&text={0}&hl=en&sl={1}&tl={2}&multires=1"

def printParams(data):
    for x in data:
        print(u"\t{0}".format(x))


def tr(text, sourcelang, targetlang):
    """
    Translates given string(text) from sourcelang to targetlang
    using Google Translate
    """
    request = urllib2.Request(url.format(text, sourcelang, targetlang),
      headers={ 'User-Agent': 'Mozilla/5.0', 'Accept-Charset': 'utf-8' })
    response = urllib2.urlopen(request).read()
    fixedJSON = re.sub(r',{2,}', ',', response).replace(',]', ']')
    data = json.loads(fixedJSON)
    result = {}
    result["definition"] = data[0][0]
    for row in data[1]:
        try:
            result[row[0]] = row[1]
        except:
            pass
    return result


def main():
    """
    Usage:
    first arg - string to translate
    second arg - source lang
    third arg - target lang
    """
    if len(sys.argv) == 4:
        text = urllib.quote(sys.argv[1])
        sl = sys.argv[2]
        tl = sys.argv[3]
        r = tr(text, sl, tl)
        print(u"{0} / {1} / {2}".format(r["definition"][0],
                                        r["definition"][1],
                                        r["definition"][2] or r["definition"][3]))
        del r["definition"]
        for key, val in r.iteritems():
            print(key)
            printParams(val)
    else:
        print(main.__doc__)

if __name__ == '__main__':
    main()
только printParams → print_params )
Чем улучшить…
1) использовать вместо urllib.quote urllib.urlencode() для генерации GET параметров из словаря (нагляднее, надежнее и, пожалуй, удобнее)
2) использовать официальный REST API code.google.com/intl/ru-RU/apis/language/translate/overview.html (хотя не понял есть ли там вывод альтернатив)
чуть-чуть улучшил :)
И еще придумал — можно сделать прием текста из stdin, чтоб можно было вызывать как
./translate ru en — < ru_text.txt
или
cat ru_text.txt | ./translate ru en -
Интересная мысль, завтра после работы если силы останутся попробую реализовать :)
Немного подправил под себя, может изменения будут интересны.
@@ -11,0 +12,5 @@
+# Set utf-8 for some stupid terminals
+import codecs
+if sys.stdout.encoding == None:
+    sys.stdout = codecs.getwriter('utf8')(sys.stdout)
+
@@ -16 +21 @@
-      print "\t " + val
+      print "     " + val
@@ -35,4 +40,5 @@
-  if len(sys.argv) == 4:
-    list_of_params.update({'text' : sys.argv[1],
-                           'sl' : sys.argv[2], 
-                           'tl' : sys.argv[3] })
# You can run "gtrans en ru hello world" now
+  if len(sys.argv) >= 4:
+    list_of_params.update({'text' : " ".join(sys.argv[3:]),
+                           'sl' : sys.argv[1], 
+                           'tl' : sys.argv[2] })
восклицательный знак в исходном тексте режет весь дальнейший текст.

translate «hi! bifidokk»
привет! / hi! / privet!

translate «hi bifidokk»
привет bifidokk / hi bifidokk / privet bifidokk

Потому что надо писать в одинарных кавычках :) '
python translate.py 'hi! bifidokk goooooooogle' en ru

аналогично, попробуйте сами
Ответ парсится неверно просто. Гугл отдает переводы по отдельным приложениям, а тут анализируется только первое. Если делать клиент для текстов с произвольным числом предложений, надо конечно же скорректировать алгоритм. Вот например для node.js вариант из моей либы:

        response.on('end', function () {
            data = data.replace(/,+/g, ',').replace(/,\]/g,']');
            var obj = JSON.parse(data);
            callback(obj[0].map(function (sentence) { return sentence[0]; }).join(''));
        });
Немного не в тему, но вот другой интересный вариант использования google translate в Linux консоли (увидел, кажется, на welinux.ru):

mplayer "http://translate.google.com/translate_tts?tl=en&q=hello+world"
Ух ты! Спасибо.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории