假设我正在编写一个自定义 PIP 包,其结构如下:
\n.\n| setup.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 src\n| | __init__.py\n| | useful_functions_i.py\n| | useful_functions_ii.py\n| | useful_strings.py\n|\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 tests\n | unit_tests.py\n\nRun Code Online (Sandbox Code Playgroud)\n假设useful_strings看起来像这样:
.\n| setup.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 src\n| | __init__.py\n| | useful_functions_i.py\n| | useful_functions_ii.py\n| | useful_strings.py\n|\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 tests\n | unit_tests.py\n\nRun Code Online (Sandbox Code Playgroud)\n并且useful_functions_i和useful_functions_ii包含执行以下操作的函数:
USEFUL_STRING_A = "useful-string-a"\nUSEFUL_STRING_B = "useful-string-b"\n...\nRun Code Online (Sandbox Code Playgroud)\n我应该如何导入useful_stringsand ?useful_functions_iuseful_functions_ii(这并不是一个看起来那么简单的问题。)
如果我使用:
\ndef a_useful_function(a_string):\n if a_string == useful_strings.USEFUL_STRING_XYZ:\n return True\n return False\nRun Code Online (Sandbox Code Playgroud)\nsrc如果我尝试在本地运行一些代码,那么效果会很好;pip install .如果我运行并尝试将代码库用作 …
请注意,我是从人类可读性的角度来看这一点的,而不是将正在使用的单位告知程序本身。
我目前正在从事一个与机械工程有密切联系的项目,多次出现的问题之一是我的代码不清楚给定数量的单位- 通常是一个常数,但是批评也可以扩展到一些变量 - 被衡量。
目前,我正在这样做:
length = 28
# ^^^ measured in mm ^^^
Run Code Online (Sandbox Code Playgroud)
但这感觉很hacky,有点难看。我可以这样做:
length = 28 # <<< measured in mm
Run Code Online (Sandbox Code Playgroud)
这看起来更好,但我在大学里被灌输内嵌评论是邪恶的,这是一种我无法摆脱的偏见。(虽然话虽如此,我在大学里只教过 C 和 Java,内联注释的陷阱更明显。Python 中可以接受内联注释吗?)
是否有一些有用的约定来规定如何以清晰优雅的方式指示数量单位?还是我独自一人?
几周前,我完成了 Python 的技术测试。虽然测试的总体反馈非常积极,但我在反馈中看到的令我惊讶的一件事是:
\n\n\n没有封装 \xe2\x80\x93 大量的 public_functions 应该是 _private_functions
\n
这让我感到惊讶,因为根据我作为 Python 开发人员两年来在脑海中建立的模糊画面,我们实际上并没有在 Python 中执行私有方法或函数。我们所拥有的只是惯例、速记和君子协定的拼凑而成。但我脑海中的那个画面是正确的吗?
\n因此,我更深入地研究了这个问题,查阅了标准 Python 文档以及PEP 8,并得出了以下结论:
\n__spam被解释为_classname__spam. 这可以用来模拟一种粗略的隐私,这样如果有人尝试__spam从类之外调用,就会引发异常。_single_leading_underscore时不会导入from M import *,但我找不到其他任何内容。然而,这只是告诉我我可以做什么,而不是我应该做什么。
\n我是否可以将上述反馈视为来自可能将其职业生涯花在 Java/C#/etc 编程上的人,因此在使用 Python 进行封装时没有正确的心态?或者我应该重新思考编写 Python 程序的方式,以便任何封装都更加明确?
\n