LINUX.ORG.RU

хочется аннотаций из java в python

 


1

2

Ну или расскажите каким образом мне навесить на поля объекта дополнительную информацию, напр. строку «Это адрес сервера, вида <hostname>:<port>»

зы. это скрипт на питоне из одного файла, так что особожирные варианты не подойдут

Deleted

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

не уверен, что это тебе действительно нужно, но возьми и декоратором приклей все что нужно

shty ★★★★★
()

Написать комментарий, нет? Всякие IDE, да даже vim+YCM покажут комментарий при автодополнении поля. А как собираешься использовать, как комментарий или непосредственно использовать эту строку при выполнении?

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

во-первые есть и на класс, во-вторых дектораторы вешаются на объекты спокойно, в-третьих если не нравятся декораторы, кто мешает на объект ручками поклеить все что хочется (цэ ж питон - тут все можно)?

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

на класс они ничего не дадут, суть в том чтобы с объявлением поля шли все метаданные о нем. А описать их в десяти местах можно и так, можно в конце концов накидать объект Field и навтыкать в него куча всего, а потом эти штуки сунуть вкласс и в runtime попытаться выдать это за обычный объект. Но это монструозно.

Deleted
()
Ответ на: комментарий от true_admin
~ % python
Python 2.7.12rc1 (default, Jun 13 2016, 09:20:59) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = "test"
>>> s.name = 'theField'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'name'

это всетаки не жаваскрипт

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

ггг, ты не понимаешь что такое питон )) вешаешь декоратор на класс (или на объект класса), а внутри декоратора - берешь и меняешь/добавляешь/удаляешь всё что твоя душа пожелаешь - можешь весь объект заменить, если надо (хотя это и неправильно)

shty ★★★★★
()
class Foo(object):
  f1 = {"att1": "bzz"}
  def __init__(self, a):
    self.f1 = a

>>> o = Foo(100)
>>> o.f1
100
>>> Foo.f1
{'att1': 'bzz'}

Правда, следить за согласованностью имен полей класса Foo и полей объекта класса Foo придется самому. Хотя, наверное, можно навесить декоратор на класс, а в нем проставить __slots__... но для однофайловой программы это оверкилл.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 2)

Ну или расскажите каким образом мне навесить на поля объекта дополнительную информацию, напр. строку «Это адрес сервера, вида <hostname>:<port>»

ну очередная овер-инжереринговая идея :-) ...

..хочешь сделать какой-то ЯКОБЫ задел (инженерный) на будущее, который ЯКОБЫ ты потом как-то сможешь исползовать.

якобы это даст тебе какуюто расширяемость в будущем.

но факт в том что 99.9% этих оверинженеринговых идей — так и остаются невостребованными на практике.

и ты не один такой.

есть например и умники, которые например вместо того чтобы использовать экземпляр словаря (dict()) — придумывают убер-классы, которые на самом деле не делают ни чего больше, чем обыкновенные экземпляры класса dict.

ну а тебе вот понадобилсь не словарь, а строку заоверинженерить — ну безсмысленно это, вот и всё.

осознай реальность — это только ЗАМУТНИТ твой исходный код ненужными сущностями.

исходный код разрастается увеличиваясь в разы, а практичной полезности ноль

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

99.9% этих оверинженеринговых идей — так и остаются невостребованными на практике

100%, по определению оверинженеринга. Но ты главное не объяснил, почему идея белки - оверинжинеринг.

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

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

верно . не объяснил. :-)

я почему-то подумал что это очевидно. возможно я был не прав (то есть — не очевидно).

тогда расказываю — избыточная конструкция, не несущая в себе практической пользы (ведь какая нам разница что за аннотация у объекта — на практике?), и создающая впечатление что в будущем это быть-может обретёт пользу, но пока-что низвестно каким образом.... --- вот эта савокупность признаков подталкивает подумать что это оверинженеринг

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

Вот я думал писать об этом или не писать и решил не усложнять :). Короче, да, есть corner cases со слотами, но тебе это не нужно, на твоих классах всё будет работать.

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

я почему-то подумал что это очевидно

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

anonymous
()

чтобы быть немножко коструктивным (а не разводить одну лишь критику) — напомню про

weakref.WeakKeyDictionary [ https://docs.python.org/3/library/weakref.html#weakref.WeakKeyDictionary ]

но главное только быть остородным и случайно не сделать циклических ссылок с замыканием через этот словарь :-)

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

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

и при этом код становится абсолютно НЕгибким:

в момент исполнения (runtime) невозможно навесить или снять аннотацию.

а зато проверяются аннотации именно в момент runtime.

то есть невозможно динамически определить (задекларировать) поведение объекта.

--------------------------------------------------

то есть создаётся впечатление, что аннотации в Java — это просто *грязный_хак* через который Java-программисты могут хоть как-то позволить сокращать размеры исходных кодов и не заниматься копипастом...

(в Python например утиная типизация позволяет сокращать размер исходных кодов.. а Java-программистам что делать? плодить тысячи интерфейсов? ну вот они и придумали/используют аннотации)

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

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

вот в том то и нюанс что следить и все такое, если заморачиваться мануальщиной то так

class Foo(object):
  def __init__(self, a):
    _magick("f1", a, {'att1':'bzz'})

Унутре _magick несложно навтыкать нужных костылей

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

Теперь у меня появилось стойкое чувство что ты что-то делаешь неправильно. Лучше покажи скрипт пока не поздно.

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

вот в том то и нюанс что следить и все такое

Тебе виднее, в чем там нюансы. Можно написать систему всеобъемлющего контроля, не вопрос.

если заморачиваться мануальщиной то так

_magick(«f1», a, {'att1':'bzz'})

Жабисты... Я привел работающий пример, без непонятных костылей в _magic.

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

Поздно, он уже ушел:

class Bootstrap:
    def __init__(self):
        #...
        parser = argparse.ArgumentParser()
        parser.add_argument('-t', '--timeout', dest='timeout', action='store',
                            type=int,
                            help='timeout in sec between node registration updates')
        parser.add_argument('-v', '--verbose', dest='log_level', action='count',
                            help='logging level, -v is INFO, -vv is DEBUG')
        #...
        args = parser.parse_args()

        config = configparser.ConfigParser()
        #...

        cm = config['main']

        def get(name, converter=None):
            res = getattr(args, name, None)
            if res is None:
                res = cm.get(name)
            if callable(converter):
                res = converter(res)
            return res

        self.log_level = get('log_level', int)
        self.timeout = get('timeout', int)
        #...

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

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

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

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

помимо того что итак надо вручную следить за именами полей

Следить? Я думал, у тебя уже есть поля, и нужно просто добавить к ним метаданные. Впрочем, неважно.

так еще и надо писать код который работает с твоими метаданными

Моими метаданными? O_o

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

1) у тебя ArgumentParser сам делает преобразование из строки в нужный тип

2) вместо «if callable(convertor)» лучше просто «if convertor» т.к. подразумевается что если его передали в функцию то его надо использовать.

3) И вообще тебе тупо нужен https://pypi.python.org/pypi/ConfigArgParse с конфигом значений по-умолчанию. Но уже поздно, да.

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

1) у тебя ArgumentParser сам делает преобразование из строки в нужный тип

а конфиг парсер - нет, потому надо колхозить

И вообще тебе тупо нужен

не, основное мое условие - работа на стандартных либах

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

не люблю когда пользователи гневятся 8)

Deleted
()

Если ты имеешь в виду DI, то лучше это не делать в python. Все известные мне реализации оказались ужасно неповоротливым говном, которое ломается на любом изменении не аккуратном.

xpahos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.