Size: a a a

2020 February 03

λ

λоλторт in rust_offtopic
без сабтайпинга
источник

p

polunin.ai in rust_offtopic
Nick Linker
И что можно сделать с ними?
def foo(name, __types={},  **kwargs):
 if name in __types:
   return __types[name](**kwargs)
 else:
   exec(f"class {name}:\npass")
   __types[name] = exec(f"{name}")
   obj = exec(f"{name}()")
   if kwargs:
     for k, v in kwargs.items():
       setattr(obj, k, v)
   return obj

obj1 = foo("Foo", a="b") # создаст тип Foo и вернёт объект Foo { a="b" }
obj2 = foo("Foo", a=1) # вернёт объект Foo { a=1 }
obj3 = foo("Some") # создаст тип Some и вернёт объект без полей


То есть можно, но это дикая магия и рантайм, который протестировать очень сложно.
P.s. конкретно функция выше не сработает, там ещё конструктор нужно создать.
источник

λ

λоλторт in rust_offtopic
polunin.ai
def foo(name, __types={},  **kwargs):
 if name in __types:
   return __types[name](**kwargs)
 else:
   exec(f"class {name}:\npass")
   __types[name] = exec(f"{name}")
   obj = exec(f"{name}()")
   if kwargs:
     for k, v in kwargs.items():
       setattr(obj, k, v)
   return obj

obj1 = foo("Foo", a="b") # создаст тип Foo и вернёт объект Foo { a="b" }
obj2 = foo("Foo", a=1) # вернёт объект Foo { a=1 }
obj3 = foo("Some") # создаст тип Some и вернёт объект без полей


То есть можно, но это дикая магия и рантайм, который протестировать очень сложно.
P.s. конкретно функция выше не сработает, там ещё конструктор нужно создать.
что мешает мне то же самое в хаскеле делать?
источник

p

polunin.ai in rust_offtopic
λоλторт
что мешает мне то же самое в хаскеле делать?
Хз
источник

p

polunin.ai in rust_offtopic
Сделай если можно
источник

λ

λоλторт in rust_offtopic
polunin.ai
Сделай если можно
зачем?
источник

p

polunin.ai in rust_offtopic
Покажи что можно
источник

λ

λоλторт in rust_offtopic
зачем?
источник

p

polunin.ai in rust_offtopic
Тогда не говори что и там так можно :\
источник

NL

Nick Linker in rust_offtopic
polunin.ai
def foo(name, __types={},  **kwargs):
 if name in __types:
   return __types[name](**kwargs)
 else:
   exec(f"class {name}:\npass")
   __types[name] = exec(f"{name}")
   obj = exec(f"{name}()")
   if kwargs:
     for k, v in kwargs.items():
       setattr(obj, k, v)
   return obj

obj1 = foo("Foo", a="b") # создаст тип Foo и вернёт объект Foo { a="b" }
obj2 = foo("Foo", a=1) # вернёт объект Foo { a=1 }
obj3 = foo("Some") # создаст тип Some и вернёт объект без полей


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

λ

λоλторт in rust_offtopic
polunin.ai
Тогда не говори что и там так можно :\
почему?
источник

λ

λоλторт in rust_offtopic
я точно знаю, что я могу туда заэмбедить весь питон
источник

λ

λоλторт in rust_offtopic
и эту магию тоже
источник

p

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

NL

Nick Linker in rust_offtopic
polunin.ai
Не понял, какой пакет?
Откуда класс Some загружен?
источник

p

polunin.ai in rust_offtopic
Nick Linker
Откуда класс Some загружен?
Допустим это имя прилетело по сети
источник

p

polunin.ai in rust_offtopic
А клас создаётся в рантайме
источник

NL

Nick Linker in rust_offtopic
polunin.ai
А клас создаётся в рантайме
Ну это неотличимо от случая pickle.load(), разве нет?
источник

p

polunin.ai in rust_offtopic
Не помню что оно делает, за гляну
источник

NL

Nick Linker in rust_offtopic
polunin.ai
Не помню что оно делает, за гляну
Ну примерно то, о чём ты говоришь. Получить произвольный суп из байтов и материализовать его в виде графа объектов.
источник