Python 与C库接口时保留/剥离类名前缀的策略

Python 与C库接口时保留/剥离类名前缀的策略,python,naming-conventions,naming,Python,Naming Conventions,Naming,我有一个C库,它公开了像SkiUser和SkiContact这样的类型,并且有许多像SkiUserLogin()和SkiUserLogout()这样的函数,它们接受指向相关类型的指针作为第一个参数 我想为这个库创建Python/Cython接口,SkiUserLogin()应该成为SkiUser对象的login()方法,这似乎很自然 问题是-鉴于每个类型名称都以Ski开头,我是否应该在Python类中保留此前缀,因此我有以下内容: from ski import SkiUser user = S

我有一个C库,它公开了像
SkiUser
SkiContact
这样的类型,并且有许多像
SkiUserLogin()
SkiUserLogout()
这样的函数,它们接受指向相关类型的指针作为第一个参数

我想为这个库创建Python/Cython接口,
SkiUserLogin()
应该成为
SkiUser
对象的
login()
方法,这似乎很自然

问题是-鉴于每个类型名称都以
Ski
开头,我是否应该在Python类中保留此前缀,因此我有以下内容:

from ski import SkiUser
user = SkiUser(...)
user.login()
或者我应该把它剥开,只以包裹的名义保存

import ski
user = ski.User(...)
user.login()

关于使用哪种方法以及原因,有什么建议吗?

我将从类型名称中删除
Ski
。如果每个类型和函数都有相同的前缀,那么它可能意味着一个名称空间

此外,您应该使用
import ski
,而不是其他变体。有一个很好的解释,你为什么要这样做:

可以通过使用 import语句的特殊语法:
来自modu import*
。这是 通常被认为是坏习惯使用
导入*
会使代码更难理解 阅读并减少依赖项的划分。

使用modu import func中的
可以精确定位所需的功能 导入并将其放入全局命名空间。虽然危害小得多 而不是导入*,因为它明确显示了在 全局名称空间,它比更简单的导入modu的唯一优势是 这样可以节省一点打字时间

非常糟糕

更好

最佳


我将从类型名称中删除
Ski
。如果每个类型和函数都有相同的前缀,那么它可能意味着一个名称空间

此外,您应该使用
import ski
,而不是其他变体。有一个很好的解释,你为什么要这样做:

可以通过使用 import语句的特殊语法:
来自modu import*
。这是 通常被认为是坏习惯使用
导入*
会使代码更难理解 阅读并减少依赖项的划分。

使用modu import func中的
可以精确定位所需的功能 导入并将其放入全局命名空间。虽然危害小得多 而不是导入*,因为它明确显示了在 全局名称空间,它比更简单的导入modu的唯一优势是 这样可以节省一点打字时间

非常糟糕

更好

最佳


虽然我同意简洁明了的
modu.sqrt
,但不那么漂亮,而是真实的
selenium.webdriver.common.keys.keys
?对于这种情况,我建议使用别名,如
import selenium.webdriver.common.keys as skey
,然后您可以编写
skeys.Keys
。虽然我同意简短的
modu.sqrt
,但不如说不那么漂亮,而是真实的
selenium.webdriver.common.Keys
?对于这种情况,我建议使用别名,比如
导入selenium.webdriver.common.Keys作为skeys
,然后您可以编写
skeys.Keys
[...]
from modu import *
[...]
x = sqrt(4)  # Is sqrt part of modu? A builtin? Defined above?
from modu import sqrt
[...]
x = sqrt(4)  # sqrt may be part of modu, if not redefined in between
import modu
[...]
x = modu.sqrt(4)  # sqrt is visibly part of modu's