LINUX.ORG.RU
ФорумTalks

Код-инжекшены в убогом питон

 , ,


1

4

да выбрасывает ексепшен, но выброс ексепшена == борьба со следствиями, а именно с кодинжекшеном.

>>> class Foo():
...     def __init__(self, **kw):
...             print(kw)
... 
>>> d = {'self': 'abc', 'a': 1, 'b': 2}
>>> 
>>> Foo(**d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() got multiple values for argument 'self'

Ща адепты мне расскажут что так делать нельзя.

Типа в шаблон jinja нельзя передавать self. Придумайте новое имя. Ага.

Для специалистов: если атаковать не первый параметр (self), а скажем опциональный, то будет весело:

>>> class Foo():
...     def __init__(self, a=None, **kw):
...             print('a=', a, kw)
... 
>>> d = {'self1': 'abc', 'a': 1, 'b': 2}
>>> 
>>> Foo(**d)
a= 1 {'self1': 'abc', 'b': 2}
<__main__.Foo object at 0x7f9a14ec5a58>
>>>
★★

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

передать переменную self в шаблон.

есть класс, который имеет метод, формирующий некую txt'шку с использованием шаблона.

Хочу в шаблоне манипулировать ключевым словом self по следующим причинам:

  • это метод, соответственно self - идеальное имя для переменной
  • впрочем достаточно: первая причина вполне достаточна
rsync ★★ ()
Ответ на: комментарий от Pacmu3ka

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

rsync ★★ ()

Код-инжекшены

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

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

self - идеальное имя для переменной

Ты код один пишешь и читать его никто не станет ? Если нет - ты чудак на букву м. А вообще this.

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

есть класс, который имеет метод, формирующий некую txt'шку с использованием шаблона.

Этому методу необходим экземпляр класса для формирования txt'шки? Если нет, то метод нужно сделать статическим (без аргумента self).

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

На тебе твой self.

>>> class Foo():
...     def __init__(fuck, **kw):
...             print(kw)
... 
>>> d = {'self': 'abc', 'a': 1, 'b': 2}
>>> Foo(**d)
{'self': 'abc', 'a': 1, 'b': 2}
<__main__.Foo object at 0x7fdd4ba02a90>
>>> 

urxvt ★★★★★ ()
Ответ на: комментарий от rsync
In [1]: class Bar:
   ...:     def __init__(this, **kw):
   ...:         print(kw)
   ...:         

In [2]: d = {'self': 'abc', 'a': 1, 'b': 2}

In [3]: Bar(**d)
{'self': 'abc', 'a': 1, 'b': 2}
Out[3]: <__main__.Bar at 0x7fd95052d2b0>



Ты это хотел шоле, наркоман несчастный... Я бы не хотел после тебя приходить в проект. Ты просто эпичный диверсант) Так держать ;З

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

На тебе твой self.

не подходит. Причин много.

  • Главная - код метода находится в библиотеке.
  • fuck тоже может понадобиться
rsync ★★ ()
Ответ на: комментарий от rsync

fuck тоже может понадобиться

Это да, без факов с питоном тошно совсем.

bread ()

Ща адепты мне расскажут что так делать нельзя.

Потому что так делать нельзя.

/thread

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

в шаблоне манипулировать... метод

Ну ты и упоролся.

Shadow ★★★★★ ()

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

dem ()

Типа в шаблон jinja нельзя передавать self. Придумайте новое имя. Ага.

Да ты упорот. Причем тут джинжа? Начал за ОБЩЕЕ, закончил за ЧАСТНОЕ. Усбагойся, проблема не в ЯП, а в твоей тупизне. Погугли про позиционные и именованные аргументы в python.

Для МЕТОДОВ ЭКЗЕМПЛЯРА (надо отличать от методов класса и статических методов) НЕЯВНЫМ образом передается ЭКЗЕМПЛЯР КЛАССА и НЕВАЖНО, как он называется, ВАЖНО, чтобы он был ПЕРВЫМ аргументом. Усек, квривожоп?

Переименуй свой сельф в хренельф и будет тебе счастье с твоей джинджей.

class A:
    def __init__(zelf, **kwargs):
        print("ololo", kwargs)

d = {'self': 'abc', 'a': 1, 'b': 2}

A(**d)
ololo {'self': 'abc', 'a': 1, 'b': 2}
KernelPanic ()
Последнее исправление: KernelPanic (всего исправлений: 1)
Ответ на: комментарий от Crocodoom

Да вообще в шаблоне логики быть не должно. Армин конечно крут и джинджа часто выручает, но... Если человек «гений» он во всем «гений» как ТС

dem ()

Ну что тут сказать, да будет срач. Питоновбросы последнее время на ЛОРе заходят на ура.

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

Потому что так делать нельзя

убогий язык же.

отдельно сделали словарь, отдельно сделали список позиционных параметров.

но словарь сделан хаком: разворачивается с кодинжекшеном. когда кодинжекшен приводит к коллизии - получается ексепшен. когда не приводит - получается замещение параметров списка словарём.

пендык

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

Так скучножешь. Антихриста нет. Ирси слился. Вот молодое поколение пришло (что удивительно с перлом)...

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

убогий язык же.

Убогий, убогий... Вы не волнуйтесь. Вас никто не держит. Мы вот сейчас в тетрадочку запишем...

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

переименуй

в jinja послать пул реквест? или как?

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

в jinja послать пул реквест

Пошли. Или ссышь? Армину я так и скажу что вот рсинк есть и он сразу хвост подожмет.

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

Да вообще в шаблоне логики быть не должно

при чем тут логика? логики и нет. Обычный шаблон.

user.generate_welcome_message()
Привет, {{ self.username }}! Авторизационная СМС будет отправлена на телефон {{ self.phone }}.
rsync ★★ ()
Последнее исправление: rsync (всего исправлений: 1)
Ответ на: комментарий от dem

Пошли. Или ссышь?

исправлять недостатки языка исправляя имена в библиотеках? не смешно даже

rsync ★★ ()

Все перлофилы такие употорые?

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

Всем «перлофилам» свойственно чувство красоты.

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

Привет, {{ self.username }}! Авторизационная СМС будет отправлена на телефон {{ self.phone }}.
Привет, {{ user.username }}! Авторизационная СМС будет отправлена на телефон {{ user.phone }}.

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

user - это если шаблон собирается ВНЕ класса,

если же шаблон формируется изнутри метода класса, то наиболее правильным будет название self.

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

да там не ООП, а какой-то сборник __хаков__ и вот глюков

rsync ★★ ()

Ща адепты мне расскажут что так делать нельзя.

Но ведь нельзя же. придумай другое имя. тот же this.

по второму твоему кейсу же, оказывается PEP по positional only parameters ещё не утвердили, так что ничего не поделаешь.

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

user.generate_welcome_message()

Стоп, а какого ляда у тебя model instance вообще шаблоны юзает? Это особые perl'овое понятия о красоте?

templarrr ★★★★★ ()
Последнее исправление: templarrr (всего исправлений: 1)
>>> class Foo():
...     @staticmethod
...     def __init__(self, a=None, **kw):
...             print('a=', a, kw)
... 

:)

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

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

eternal_sorrow ★★★★★ ()
Ответ на: комментарий от rsync
Привет, {{ username }}! Авторизационная СМС будет отправлена на телефон {{ phone }}
dem ()
Ответ на: комментарий от rsync

исправлять недостатки языка исправляя имена в библиотеках? не смешно даже

Ну тоесть ссышь. Напиши в рассылку Python

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

Все перлофилы такие употорые?

Да он и в perl не умеет

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

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

поэтому от модели отделять бессмысленно: так же как от модели не отделяют Database Layer.

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

Всем «перлофилам» свойственно чувство красоты.

$красоты

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

да никто у него не примет такой PR, где в объявлении метода self заменяется чем то иным.

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

Да нет. Пусть прославится не только на ЛОР. Будет звездой. А еще потом его реальные perl hackers в подворотне того этого регэкспами

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

API использует какой то формат сериализации, например json. им и формируй тело запроса а не шаблонами.

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

API использует какой то формат сериализации, например json. им и формируй тело запроса а не шаблонами.

какой-то формат сериализации неудобен. Сериализуем например в сложный, формальными правилами не сериализуемый язык: SQL, XML, HTML, Text.

Кодогенерируем на Python что-то еще, например.

итп

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

Ладно хочешь я в твоем стиле докажу что perl убогое поделие?

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

Сам язык прекрасный (точнее бы до последних версий), убогий в питоне только интерпретатор. Подобные вещи в питоне не баг, а фича. Вкупе с рефлексией они дают офигенную гибкость.

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

формальными правилами не сериализуемый язык

XML

o_o 0_o o_0 O_O Не поддается формальными правилами? DOM - Ааааааааа... Упячка..

dem ()

о, новая серия поедания кактусов подъехала. жаль нельзя подписаться на ТС

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

Не поддается формальными правилами

нет, например

[{'a': 'b'}, {'a': 'c'}]

сериализуется 100500 способами. Формальных правил нет

<alist>
  <a value="b"/>
  <a value="c"/>
</alist>

<as>
  <a>b</a>
  <a>c</a>
</as>

<a>
  <entity value="b"/>
  <entity value="c"/>
</a>

сколько людей - столько и вариантов сериализации будет.

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