阿里云的 Python SDK 是真的烂啊, 想起个 aliyunpythonsdksucks 项目组, 然后把他们的 sdk 封装一下

2019-01-22 17:00:12 +08:00
 LeoQ

槽多无口, 里面的接口还有 v20140815 , 所有的 class 看起来都一样, 一样的长, 一样的难以理解

举个例子 CreateOnlineDataBaseTaskRequest

# 阿里云的代码
from aliyunsdkcore.request import RpcRequest
class CreateOnlineDatabaseTaskRequest(RpcRequest):

    def __init__(self):
        RpcRequest.__init__(self, 'Rds', '2014-08-15', 'CreateOnlineDatabaseTask','rds')

    def get_ResourceOwnerId(self):
        return self.get_query_params().get('ResourceOwnerId')

    def set_ResourceOwnerId(self,ResourceOwnerId):
        self.add_query_param('ResourceOwnerId',ResourceOwnerId)

    def get_MigrateTaskId(self):
        return self.get_query_params().get('MigrateTaskId')

    def set_MigrateTaskId(self,MigrateTaskId):
        self.add_query_param('MigrateTaskId',MigrateTaskId)

    def get_DBName(self):
        return self.get_query_params().get('DBName')

    def set_DBName(self,DBName):
        self.add_query_param('DBName',DBName)

    def get_ResourceOwnerAccount(self):
        return self.get_query_params().get('ResourceOwnerAccount')

    def set_ResourceOwnerAccount(self,ResourceOwnerAccount):
        self.add_query_param('ResourceOwnerAccount',ResourceOwnerAccount)

    def get_ClientToken(self):
        return self.get_query_params().get('ClientToken')

    def set_ClientToken(self,ClientToken):
        self.add_query_param('ClientToken',ClientToken)

    def get_OwnerAccount(self):
        return self.get_query_params().get('OwnerAccount')

    def set_OwnerAccount(self,OwnerAccount):
        self.add_query_param('OwnerAccount',OwnerAccount)

    def get_DBInstanceId(self):
        return self.get_query_params().get('DBInstanceId')

    def set_DBInstanceId(self,DBInstanceId):
        self.add_query_param('DBInstanceId',DBInstanceId)

    def get_CheckDBMode(self):
        return self.get_query_params().get('CheckDBMode')

    def set_CheckDBMode(self,CheckDBMode):
        self.add_query_param('CheckDBMode',CheckDBMode)

    def get_OwnerId(self):
        return self.get_query_params().get('OwnerId')

    def set_OwnerId(self,OwnerId):
        self.add_query_param('OwnerId',OwnerId)
# 我想要的代码
class DatabaseTask:
    def __init__(self, **kwargs):
        self.migrate_task = migrate_task
        self.db_name = db_name
        self.resource_owner = resource_owner
        self.token = token
        self.check_db_mode = check_db_mode
    
    def run():
        # make some request

if __name__ == '__main__':
    new_task = DatabaseTask(migrate_task=1, db_name='some_db',
                            resource_owner='some_user', token='some_token',
                            check_db_mode='some_mode')
    result = new_task.run()
    result.fetch()

为什么不写成 一个 DatabaseTask 对象, 对象有几个属性值 Instance_id 等 ,然后再调用 DatabaseTask.create()

这些 set 和 get 的方法, 不就是实现了 python 的属性值吗?

我这里想问一下大家, 如果我这么做了, 会收到律师函吗?

6028 次点击
所在节点    Python
34 条回复
glasslion
2019-01-22 17:19:35 +08:00
这种代码一看就是 先有 Java 的 SDk, 实现 Python SDK 时直接照搬了 Java 的实现。 这种行为虽然挺恶心的, 但毕竟是最节省开发资源的做法,也只能忍了 。

Google 的 Python SDK 一样大量这种代码。


抛开代码风格的问题, 阿里云 Python SDK 早期的代码质量极差, 连培训班水平都不如。 目前的质量已经比以前好太多了。
https://github.com/aliyun/aliyun-openapi-python-sdk/issues/43
www5070504
2019-01-22 17:21:55 +08:00
支持 这种带有 java “风味”的 python 代码是 python 中的毒瘤
qq976739120
2019-01-22 17:24:07 +08:00
我之前看他们的代码以为是我功力不够的原因....原来是他们写的查,汗!
wuhaochen999
2019-01-22 17:43:33 +08:00
get set 有啥问题
Cbdy
2019-01-22 18:08:59 +08:00
估计是直接根据 Java SDK 代码用编译器编译成 Python 代码的(代码生成)吧,其他语言类似。这样只需要维护一份 Java 代码即可
wusphinx
2019-01-22 18:10:11 +08:00
在保证代码正确性的前提下,代码不够 pythonic 还是可以接受的
alvin666
2019-01-22 18:13:19 +08:00
妈耶
这代码要人命啊
janxin
2019-01-22 18:15:22 +08:00
支持,每次用 Python 的 SDK 用的想死
aldslvda
2019-01-22 19:05:58 +08:00
java 味太浓
dongqihong
2019-01-22 19:32:18 +08:00
这是自动化生成的接口代码。。。
shaodamao
2019-01-22 19:50:50 +08:00
之前用过他们的 python sdk,sdk 代码应该是根据 api 生成的。
可以用 aliyunsdkcore.request 中的 CommonRequest,自己封装了个通用的方法,将就用一下 orz
bestkayle
2019-01-22 20:26:01 +08:00
这明显是自动生成的代码。。和机器人较真干啥。
iorilu
2019-01-22 22:18:37 +08:00
这个 sdk 是干啥用的
Faiz555
2019-01-22 23:03:28 +08:00
用过阿里云的短信 SDK,调用的时候感觉巨恶心
luozic
2019-01-22 23:49:45 +08:00
这种要么是基于 Java 生成,要么直接根据 OAI 类似 swagger 的规范直接一把生成,不分 java 还是啥
qingtangsdk
2019-01-22 23:59:57 +08:00
亲们,大家好,我是阿里云 SDK 的研发 GG,看到吐槽就赶紧诚惶诚恐地过来啦^_^。首先感谢大家对阿里云 Python SDK 的关注,这里跟大家十分十分(* 1024 )诚恳地道歉,Python SDK 没有按照 Python 的编码规范设计,我们没做好,给大家造成了不好的体验,对不起!

为了解决好这个这个问题呢,我们阿里云 SDK 研发团队正在抓紧时间编写阿里云 Python SDK 的第二版,目前是刚起步,项目代码在这里: https://github.com/aliyun/alibabacloud-python-sdk-v2 请大家过目。亲们可以在: https://github.com/aliyun/alibabacloud-python-sdk-v2/issues 这里吐槽,我们会抓紧时间改进哦!

亲们的批评就是我们改进的动力,为此我们会不断努力,感谢对阿里云的关心!
lxml
2019-01-23 00:26:16 +08:00
想起了金山云的 SDK,fork 自 aws 的,然后大家表示读不懂代码,宁愿调用我的 http 接口都不愿意自己去接入。
niubee1
2019-01-23 01:26:42 +08:00
在国内的项目组里呢一般都只有边缘人和实习生才会干搞 SDK 这类事情, 质量差是很自然的事情
incompatible
2019-01-23 02:40:53 +08:00
v20140815 有什么问题? 公有云产品的 API 必须向下兼容,即便某天发布了 v2020xxxx,先前的 v20140815 也是要永久保留的。
SDK 里 client 与 request 各司其职,request 负责封装 API 的参数; client 负责从 request 取参数、做签名、拼 url 发请求、解析返回值。且各个产品的各个 API 都 follow 此 pattern,学一次就会用所有产品的 API 了。
你自己定义的 DatabaseTask 相比之下并没看出有什么优点,仅仅是满足了你自己的偏好而已。
busyboy
2019-01-23 07:54:59 +08:00
我已经很知足了,比部分云厂商的好很多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/529522

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX