Size: a a a

2020 January 30

IZ

Ilia Zviagin in SPb Python
Max Block
С логом это пример всего лишь. Я хочу максимально просто получать дикт из переменных.

var1 = ..
var2 =..

Я хочу вместо

d = {“var1”: var1, “var2: var2}

делать что-то типа:
d = magic_dict(var1, var2)
Не ограничивай своё мышление какими-то там условностями, переменными этими , и вот всей этой ерундой
источник

MB

Max Block in SPb Python
Ilia Zviagin
Так доведи это до логического конца, не делай переменные вообще, храни всё в словарях, все данные!
Я выше четко сформулировал поставленную задачу. Зачем мне все хранить в словарях?

Если вы знаете, почему моя задумка принципиально вредна для питона, то я хотел бы ее услышать.

Напомню первоначально описанную задачу:


Существует ли какая-нить библиотека, которая могла бы сделать следующее?

var1 = "bla"
var2 = "bla"

assert black_magick_lib.to_dict(var1, var2) == {"var1": var1, "var2": var2}

Хочется получить в питоне того же, что есть в JavaScript:

const var1 = "bla"
const var2 = "bla"
const d = {var1, var2}

Через inspect модуль это сделать как-то возможно.
__

В стандартном питоне этого нет, я это знаю. Но возможно существуют люди, которые много работали с JavaScript и прониклись удобством синтаксиса написания объектов {var1, var2, …}. И сделали библиотеку.
источник

DM

Dmitriy Morozov in SPb Python
>>> a = 1
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1}
>>> def magic_dict(source_dict, *args):
...     result = {}
...     for i in args:
...             result[i] = source_dict.get(i)
...     return result
...
>>> magic_dict(locals(), "a")
{'a': 1}
>>> b = 123
>>> magic_dict(locals(), "a", "b")
{'a': 1, 'b': 123}
источник

s

spb_python_bot in SPb Python
Dmitriy Morozov
>>> a = 1
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1}
>>> def magic_dict(source_dict, *args):
...     result = {}
...     for i in args:
...             result[i] = source_dict.get(i)
...     return result
...
>>> magic_dict(locals(), "a")
{'a': 1}
>>> b = 123
>>> magic_dict(locals(), "a", "b")
{'a': 1, 'b': 123}
The Zen of SPb Python Chat
(Inspired by "The Zen of Python, by Tim Peters")

- Short introduction of yourself is better than "hello".
- Link to gist is better than source paste.
- One long message is better than many short.
- Editing the message is better than correcting via another one.
- Staying on topic is better than offtopic.
- Good topic is worth discussing though.
- Unless it is started by a link to Habrahabr.
- Politeness counts.
- Bad mood is not a good reason to break the rules.
- Don't ask to ask just ask.
- Text message is better than voice message.
- Unless it is voice conference.
- Git repos are one honking great idea — let's do more of those!
источник

DM

Dmitriy Morozov in SPb Python
Max Block
С логом это пример всего лишь. Я хочу максимально просто получать дикт из переменных.

var1 = ..
var2 =..

Я хочу вместо

d = {“var1”: var1, “var2: var2}

делать что-то типа:
d = magic_dict(var1, var2)
вариант выше тебя не устроит?
источник

MB

Max Block in SPb Python
Dmitriy Morozov
>>> a = 1
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1}
>>> def magic_dict(source_dict, *args):
...     result = {}
...     for i in args:
...             result[i] = source_dict.get(i)
...     return result
...
>>> magic_dict(locals(), "a")
{'a': 1}
>>> b = 123
>>> magic_dict(locals(), "a", "b")
{'a': 1, 'b': 123}
А, теперь я понял вашу идею. Да, она работает, но тут есть минус:

- если я сделаю рефакторинг и переименую где-то переменную a, то в строковом значение “a” она автоматом не переименуется
- хоть ваш вариант и короче, чем {“var1”: var1, “var2:” var2}, но вариант типа vdict(var1, var2) — все равно выглядит короче )
источник

НД

Николай Домнин in SPb Python
Max Block
А, теперь я понял вашу идею. Да, она работает, но тут есть минус:

- если я сделаю рефакторинг и переименую где-то переменную a, то в строковом значение “a” она автоматом не переименуется
- хоть ваш вариант и короче, чем {“var1”: var1, “var2:” var2}, но вариант типа vdict(var1, var2) — все равно выглядит короче )
я полагаю ты ищешь вот это:
https://github.com/alexmojaki/sorcery/blob/master/README.md#dict_of
источник

НД

Николай Домнин in SPb Python
кто-нибудь уже в баре?
источник

S

Stan in SPb Python
Вот, даже либа есть. В зависимости и в прод
источник

MB

Max Block in SPb Python
Благодарю! Именно это я и искал. Я знал, что должна была быть где-то черная магия, которая мне поможет 🙂
источник

DA

Dmitry Alimov in SPb Python
Николай Домнин
кто-нибудь уже в баре?
Да)
источник

p

pragus in SPb Python
Max Block
Ну вот в JS же это работает, почему в Питоне не может? Я функцию даже написал. Но есть один случай, когда она не правильно работает:

def vdict(*fields):
   frame = inspect.currentframe()
   frame = inspect.getouterframes(frame)[1]
   string = inspect.getframeinfo(frame[0]).code_context[0].strip()
   args = string[string.find("(") + 1 : -1].split(",")  # noqa E203

   names = []
   for i in args:
       if i.find("=") != -1:
           names.append(i.split("=")[1].strip())
       else:
           names.append(i.strip())

   result = {}
   for idx, name in enumerate(names):
       result[name] = fields[idx]
   return result


вот только эта функция не будет работать, если в одной строке есть ее два вызова , типа log(vdict(a1, a2), vdict(b1,b2) — уже не сработает
господи
источник

p

pragus in SPb Python
Max Block
Я выше четко сформулировал поставленную задачу. Зачем мне все хранить в словарях?

Если вы знаете, почему моя задумка принципиально вредна для питона, то я хотел бы ее услышать.

Напомню первоначально описанную задачу:


Существует ли какая-нить библиотека, которая могла бы сделать следующее?

var1 = "bla"
var2 = "bla"

assert black_magick_lib.to_dict(var1, var2) == {"var1": var1, "var2": var2}

Хочется получить в питоне того же, что есть в JavaScript:

const var1 = "bla"
const var2 = "bla"
const d = {var1, var2}

Через inspect модуль это сделать как-то возможно.
__

В стандартном питоне этого нет, я это знаю. Но возможно существуют люди, которые много работали с JavaScript и прониклись удобством синтаксиса написания объектов {var1, var2, …}. И сделали библиотеку.
а какую практическую проблему это решает?
источник

S

Stanislav in SPb Python
Stan
Вот, даже либа есть. В зависимости и в прод
источник

MB

Max Block in SPb Python
pragus
а какую практическую проблему это решает?
Меньше кода получается. Вот пример кода после автоматического форматирования black:

from sorcery import dict_of

node = "http://domain:port"
proxy = "socks://user:pass@host:port"
holder_address = "0x11111"
token_address = "0x222222"
block_number = 1324123423
error_message = "bla"
status_code = 9


def my_long_name_function(var):
   pass


# normal version
my_long_name_function(
   {
       "hode": hode,
       "proxy": proxy,
       "address": address,
       "block_number": block_number,
       "error_message": error_message,
       "status_code": status_code,
   }
)

# black magic version
my_long_name_function(dict_of(node, proxy, holder_address, token_address, block_number, error_message, status_code))


Я больше двух лет работал с Node.JS. И мне очень нравится синтаксис для объектов: const obj = {var1, var2, var3} вместо многословного const obj = {“var1”: var1, “var2”: var2, “var3”: var3}
источник

S

Stanislav in SPb Python
Max Block
Меньше кода получается. Вот пример кода после автоматического форматирования black:

from sorcery import dict_of

node = "http://domain:port"
proxy = "socks://user:pass@host:port"
holder_address = "0x11111"
token_address = "0x222222"
block_number = 1324123423
error_message = "bla"
status_code = 9


def my_long_name_function(var):
   pass


# normal version
my_long_name_function(
   {
       "hode": hode,
       "proxy": proxy,
       "address": address,
       "block_number": block_number,
       "error_message": error_message,
       "status_code": status_code,
   }
)

# black magic version
my_long_name_function(dict_of(node, proxy, holder_address, token_address, block_number, error_message, status_code))


Я больше двух лет работал с Node.JS. И мне очень нравится синтаксис для объектов: const obj = {var1, var2, var3} вместо многословного const obj = {“var1”: var1, “var2”: var2, “var3”: var3}
Но ты и привык к паттерну хранить и передавать так параметры
источник

MB

Max Block in SPb Python
Stanislav
Но ты и привык к паттерну хранить и передавать так параметры
Нет, в обычные функции я чаще передаю параметры как keyword-аргументы. А это мне в 99% случаев надо для моей кастомной логерной функции типа custom_log(name: str, data: dict) И вот в data пихается реально большой дикт с кучей полей. И даже если эта черная магия сглючит, то ничего страшного у меня не отватился.

Хотя чего греха таить. Я даже в django люблю передавать форму через my_service.my_method(**form.cleaned_data)
источник

Y

Yokohola in SPb Python
Alex Anisimov
Всем привет!
А может ли как-то Python взаимодействовать с ms outlook?
у ms вроде апишка есть
источник
2020 February 01

ММ

МаКаС МакасОвич in SPb Python
Утро доброе. Живые сть?
источник

V\

Vadim třetí \λ.λ in SPb Python
Всегда есть
источник