https://github.com/looker-open-source/sdk-codegen#securing-your-sdk-credentials 哈, Kotlin 赛高! 现在已经很流行了,但对于一个好东西,不管多流行都是好事。
GitHub
GitHub - looker-open-source/sdk-codegen: One SDK to rule them all, and in the codegen bind them
One SDK to rule them all, and in the codegen bind them - looker-open-source/sdk-codegen
https://github.com/Experimenter/py-gtk3-codegen/blob/master/py-gtk3-codegen.py #Python #GTK
这是一个 Python GObjects 的事件模板自动代码生成(它还支持嵌套,不过咱的 codegen 加个 _indent 变量然后用递归栈改写它就也实现嵌套了)
它只支持特定的 tags: ,用的当然是啊好怀念Haskell里的写法)
input,text,comboBox,scrollBar+progressBar,checkBox,radioButton(理论应该只有radioButtonBox),spinBox,scale,treeView 和 askOpen/askSave 咱都是有的
calendar,ToolBar,StatusBar,fontButton 咱没有,毕竟 Tk 的控件系统现在已经不标准了(坏家伙)
话说 Python 的解析器感觉好难写啊,要处理的 layout 情况那么多... 要支持"\"消换行,括号还能带开启新缩进的 #ce
这是一个 Python GObjects 的事件模板自动代码生成(它还支持嵌套,不过咱的 codegen 加个 _indent 变量然后用递归栈改写它就也实现嵌套了)
它只支持特定的 tags: ,用的当然是
[ for in if ] 生成式啦(['GtkEntry','GtkTextView','GtkComboBox','GtkComboBoxEntry','GtkProgressBar',\
'GtkCheckbox','GtkRadioButton','GtkSpinButton','GtkCalendar','GtkToolBar',\
'GtkStatusbar','GtkFileChooserButton','GtkFontButton','GtkHScale','GtkVScale','GtkTreeView']] input,text,comboBox,scrollBar+progressBar,checkBox,radioButton(理论应该只有radioButtonBox),spinBox,scale,treeView 和 askOpen/askSave 咱都是有的
calendar,ToolBar,StatusBar,fontButton 咱没有,毕竟 Tk 的控件系统现在已经不标准了(坏家伙)
话说 Python 的解析器感觉好难写啊,要处理的 layout 情况那么多... 要支持"\"消换行,括号还能带开启新缩进的 #ce
GitHub
Experimenter/py-gtk3-codegen
Generates boilerplate code to import glade interface into a python file, create handles to work with editable objects and function definitions for signals defined in the glade interface - Experimen...
https://github.com/BlackHC/implicit_lambda 刚才,好像是第二次遇到类似的实现。
这个其实很简单嘛:
还是因为我不会用 Python 元编程(那需要理解它那和 JavaScript 一样混乱的面向对象模型,不像 Ruby define_method 和hooks那么简单),不然元方法可以立刻定义
当然如果用解释器模式一层一层剥开树形结构也可以做(但我觉得对这个 DSL 性能其实不重要
之前设计绝句编程语言的时候(别喷我和王垠一样谈自己没实现过的编程语言,它仅作为设计也是真正有价值的),我也考虑过添加类似 Haskell 的 sectioning:
这个其实很简单嘛:
class ImplicitLambda:
def __init__(self, code): self.code = code
def wrap(self, code): return ImplicitLambda(code)
def _op(self, op, x): return self.wrap(self.code+op+repr(x))
def __add__(self, x): return self._op("+", x)
def __call__(self, value): return eval(self.code)(value)
_ = ImplicitLambda("lambda x: x") list(map(_+1, [1,2,3])) #[2, 3, 4] 还是因为我不会用 Python 元编程(那需要理解它那和 JavaScript 一样混乱的面向对象模型,不像 Ruby define_method 和hooks那么简单),不然元方法可以立刻定义
当然如果用解释器模式一层一层剥开树形结构也可以做(但我觉得对这个 DSL 性能其实不重要
之前设计绝句编程语言的时候(别喷我和王垠一样谈自己没实现过的编程语言,它仅作为设计也是真正有价值的),我也考虑过添加类似 Haskell 的 sectioning:
map (+1) [1,2,3] 这种:建行(1、2、3)去映为「+1」 ,这被称为中缀链。可后来我把它换成 局限于中缀表达式/无参访问或中后缀算符引用的 block 了 ( 此行去映为「它+1」 ) ,不会像 Haskell 一样把隐式参数「它」省略掉,我超喜欢这种人类可读的设计的。哈哈。GitHub
BlackHC/implicit_lambda
This package adds support for implicit lambdas, so you can write `map(_ + 5, a_list)` instead of `map(lambda x: x + 5, a_list)`. - BlackHC/implicit_lambda
duangsuse::Echo
目前 codegen 已经完全 works 了,也修复了一些其它的小bug ,现在准备做 code cache 和跑分
🤔 说起来, #Python 的开发者们也真是怪纯的,不喜欢用这些杂七杂八的小技巧。
我到 GitHub 搜 "Python codegen"&lang=python ,得到的七页结果没一个是生成 Python 代码的,要么是模板系统:
https://github.com/mattduan/codegen
https://github.com/AlexFinder/CodeGen
要么是特定的模板化代码生成器:
https://github.com/siggame/Creer
看起来好像大家并不知道 Python 的动态类型可以结合上代码生成,被用来替换语言内建的调用和成员访问语法(callNew,invoke,getAttr),从而在实现原有语义的同时做到生成代码以内联铺平内部式DSL,做到零开销抽象一样。
还有数个 Swagger REST API defs file 的生成实现…… 对了,其实我觉得 Swagger 也太纯真了,都没有受到函数式大佬们的污染,因为它"优化"后也只是支持 YAML 的缩进来"简写"深层嵌套结构而已。
我之前写过类似 Swagger 的玩意,它用的 DSL 完全不需要你写出每个参数的
其实我很好奇为什么 Swagger 有那么多语言的 codegen 实现、有那么多人实现这些实现,却没有一个人想着怎么优化它的“源语言”并提交给Swagger社区呢?(猜过分点,还是有人设计了但太烂所有没采用呢emmm)
其实这个算法并不复杂,甚至不一定可以被称为「算法」(我一直相信是因为自己智商欠缺才要那么多时间才弄好的),那么为什么没有其他工程派人士弄出一样的东西来呢? 😟
我想可能是因为那些程序员平时不使用定义式风格,所以他们不会想办法进一步设计更广阔,以至于跨语言、跨底层框架的代码复用;如果有,那就是人太少了,或者没人同时了解一些编译原理入门(相对更专业的常量折叠/回填而言)习惯。
我真的是个定义式编程迷,我设计过的所有复用库都不包含复杂的逻辑/数字/几何/数据结构/树图算法(尽管我做梦都想),但它们通通具有定义式的编程 API — 多数是用 vararg 尽可能在构造时就完成配置而不用如
当然如果你写代码只是为了弄出一个 "working" 的东西,或者觉得因为自己足够聪明所以 “重构甚至重写是码农做的事”、 “调试是愚蠢的”、 “把自己所知道的明确举例讲明白是为蠢人费力的无聊事” ,那就想不到你所想不到但的确可以实现的东西了。
我到 GitHub 搜 "Python codegen"&lang=python ,得到的七页结果没一个是生成 Python 代码的,要么是模板系统:
https://github.com/mattduan/codegen
https://github.com/AlexFinder/CodeGen
要么是特定的模板化代码生成器:
https://github.com/siggame/Creer
看起来好像大家并不知道 Python 的动态类型可以结合上代码生成,被用来替换语言内建的调用和成员访问语法(callNew,invoke,getAttr),从而在实现原有语义的同时做到生成代码以内联铺平内部式DSL,做到零开销抽象一样。
还有数个 Swagger REST API defs file 的生成实现…… 对了,其实我觉得 Swagger 也太纯真了,都没有受到函数式大佬们的污染,因为它"优化"后也只是支持 YAML 的缩进来"简写"深层嵌套结构而已。
我之前写过类似 Swagger 的玩意,它用的 DSL 完全不需要你写出每个参数的
- name:"WTF" - type: xxx,与之相比 Swagger 那 YAML 语法简直就像所有调用参数都要求 kwarg 的 Python 一样冗长……其实我很好奇为什么 Swagger 有那么多语言的 codegen 实现、有那么多人实现这些实现,却没有一个人想着怎么优化它的“源语言”并提交给Swagger社区呢?(猜过分点,还是有人设计了但太烂所有没采用呢emmm)
其实这个算法并不复杂,甚至不一定可以被称为「算法」(我一直相信是因为自己智商欠缺才要那么多时间才弄好的),那么为什么没有其他工程派人士弄出一样的东西来呢? 😟
我想可能是因为那些程序员平时不使用定义式风格,所以他们不会想办法进一步设计更广阔,以至于跨语言、跨底层框架的代码复用;如果有,那就是人太少了,或者没人同时了解一些编译原理入门(相对更专业的常量折叠/回填而言)习惯。
我真的是个定义式编程迷,我设计过的所有复用库都不包含复杂的逻辑/数字/几何/数据结构/树图算法(尽管我做梦都想),但它们通通具有定义式的编程 API — 多数是用 vararg 尽可能在构造时就完成配置而不用如
.addXXX 的变更调用。尽管我一点也不愿意写 Haskell 和 Scala / Scheme(respect for its s-expr.) 等格调品味超高的(纯)函数式编程语言,函数式对我的影响我没照本宣科的接受,逼自己思考它们眼中的问题或是尝试实现它们那令人困惑的命名/建模方法。当然我知道放弃不值得炫耀,但这使我找到了不同于函数式但比函数式更易读、易维护的接口建模风格,就是 Kotlin 的风格和设计哲学,用于解决问题的东西就应该在平衡下解决尽可能多的问题、并且从不会制造其它问题。 #statement #design当然如果你写代码只是为了弄出一个 "working" 的东西,或者觉得因为自己足够聪明所以 “重构甚至重写是码农做的事”、 “调试是愚蠢的”、 “把自己所知道的明确举例讲明白是为蠢人费力的无聊事” ,那就想不到你所想不到但的确可以实现的东西了。
GitHub
mattduan/codegen
The code generator is a code generation framework written in python. It can generate files following certain template pattern. It can easily be divided into different tasks and deployed into a clou...
https://stackoverflow.com/questions/47200625/how-to-make-ttk-scale-behave-more-like-tk-scale
https://github.com/TkinterEP/ttkwidgets/blob/master/ttkwidgets/tickscale.py#L643
就是这个家伙。 我的天哪,还有什么代码能比这个更长的吗...
https://github.com/TkinterEP/ttkwidgets/blob/master/ttkwidgets/tickscale.py#L643
就是这个家伙。 我的天哪,还有什么代码能比这个更长的吗...
Stack Overflow
How to make ttk.Scale behave more like tk.Scale?
Several Tk widgets also exist in Ttk versions. Usually they have the same general behaviour, but use "styles" and "themes" rather than per-instance appearance attributes (such as bg, etc...). This is
虽然我写得很累,但我觉得应该改正下自己的坏脾气。 别人的代码即便不好,也是可以帮忙更改的。 虽然混乱的代码给我造成了麻烦,但他们设计逻辑也是很累的,代码质量不好不能全怪他们,也怪环境不好。
如果别人的库有可以改进的部分,你会费 15 分钟来提交 Pull Request 吗
Anonymous Poll
60%
会。开源就该支持
40%
会,但只改影响功能的部分
0%
不会。不好维护的代码应该由他们的创建者负责到底
https://realpython.com/python-type-checking/#gradual-typing-and-consistent-types 草,不愧是 Python 这文章...
Realpython
Python Type Checking (Guide) – Real Python
In this guide, you'll look at Python type checking. Traditionally, types have been handled by the Python interpreter in a flexible but implicit way. Recent versions of Python allow you to specify explicit type hints that can be used by different tools to…
https://github.com/microsoft/pyright/blob/da39a2a78a442d2a6b29d664b32475c361c853f1/packages/pyright-internal/src/tests/samples/dataclass8.py
欸,有更新 data class 支持,而且还内部支持 typing 实现 gradual typing 不像 Ruby 太 duck typing 了,看来 Py 还是有点东西
https://github.com/microsoft/pyright/blob/930c2021c63531248c6a979e3d3afdbcca14f16b/packages/pyright-internal/src/analyzer/types.ts#L530
欸,原来不报类型错误必须要在超类链上啊... 真是过分呢,我只是想面向对象 Mixin 啊
@dataclass
class BaseClass:
my_ref: "ReferredClass" 欸,有更新 data class 支持,而且还内部支持 typing 实现 gradual typing 不像 Ruby 太 duck typing 了,看来 Py 还是有点东西
https://github.com/microsoft/pyright/blob/930c2021c63531248c6a979e3d3afdbcca14f16b/packages/pyright-internal/src/analyzer/types.ts#L530
export function hasUnknownBaseClass(classType: ClassType) 欸,原来不报类型错误必须要在超类链上啊... 真是过分呢,我只是想面向对象 Mixin 啊
GitHub
microsoft/pyright
Static type checker for Python. Contribute to microsoft/pyright development by creating an account on GitHub.
啊…… 看来数学不好果然难呢。 重构的时候我把
xs[a:-1] 的 exclusive end -1 省略了(那就包括末项了)、 map(it*b, round(n/b)) 给理解成 range(a, n, b) 了,我加的 while a%b != 0 查找其实就是 (a/b) *b ... 虽然都是很简单的倍数关系啊
duangsuse::Echo
不过,在我经历无数烂代码的洗礼后,终于找到了bug的源头(一个str属性配置没适配...) 现在终于可以移植过来了emmmm...
有意思的是这位大神作者(可惜代码质量怎么那么差) 写出的代码虽然很好用,但其实它是薛定谔程序! 测试里应用范围内无变量,但程序行为却间隔1次时好时坏!