这个问题建立在这一个刚才问也是这一个,但是解决了更微妙的一点,具体而言,"内部类"什么罪名?
这是我的情况.我正在构建一个用于操作MS Office文件的Python库,其中许多类不是要在外部构造的,但是他们的许多方法都是API的重要部分.例如:
class _Slide(object):
def add_shape(self):
...
Run Code Online (Sandbox Code Playgroud)
_Slide
不要在外部构建,作为库的最终用户,您可以通过调用获得新的幻灯片Presentation.add_slide()
.但是,一旦你有幻灯片,你肯定希望能够打电话add_shape()
.所以该方法是API的一部分,但构造函数不是.这种情况在库中出现了几十次,因为只有Presentation类有一个外部/ API构造函数.
PEP8在这一点上含糊不清,引用了"内部类"而没有详细说明什么算作内部类.在这种情况下,我想可以说这个课程是"部分内部的".
问题是我只有两个符号来区分至少三种不同的情况:
我注意到,从通信角度来看,外部API(库最终用户受众)的清晰表达与内部API(开发人员受众)之间存在冲突.对于最终用户,呼叫_Slide()
是verboten/at-own-risk.然而,它是内部API的一个快乐成员,并且_random_helper_method()
应该只从内部调用_Slide()
.
你对这个问题有什么看法可能对我有帮助吗?惯例是否规定我在类名上使用我的"单引导下划线"弹药来争取最终用户API的清晰度,或者我是否能够保留它以便与我和其他开发人员沟通关于何时真正使用类API私有而不被使用,例如,它所在的模块之外的对象,因为它是一个可能会改变的实现细节?
更新:经过几年的进一步反思,我已经确定了在命名类时使用前导下划线的约定,这些类不是作为模块(文件)之外的类访问的.这种访问通常用于实例化该类的对象或访问类方法等.
这为模块的用户(当然通常是你自己:)提供了基本的指示:"如果导入语句中出现带有前导下划线的类名,那你就做错了." (单元测试模块是此规则的一个例外,此类导入可能经常出现在"内部"类的单元测试中.)
请注意,这是对类的访问.在模块外部访问该类(类型)的对象,可能由工厂或其他任何人提供,这是非常好的,也许是预期的.我认为将类与从它们创建的对象区分开来的失败导致了我最初的困惑.
该约定还具有在进行from module import *
声明时不包括这些类的附带好处.虽然我从不在自己的代码中使用这些并建议避免使用它们,但这是一种合适的行为,因为这些类标识符并不是模块接口的一部分.
经过多年的试验,这是我个人的"最佳实践",当然不是"正确"的方式.你的旅费可能会改变.
我想声明Python类中的一个类方法调用另一个带有一组参数的classmethod.我希望模拟的classmethod是"spec-ed",因此它会检测是否使用错误的参数调用它.
当我使用patch.object(.., autospec=True, ..)
classmethod 补丁时,classmethod被替换为a NonCallableMagicMock
并在我尝试调用它时引发错误.
from mock import patch
class A(object):
@classmethod
def api_meth(cls):
return cls._internal_classmethod(1, 2, 3)
@classmethod
def _internal_classmethod(cls, n, m, o):
return sum(n, m, o)
with patch.object(A, '_internal_classmethod') as p:
print(type(p).__name__)
with patch.object(A, '_internal_classmethod', autospec=True) as p:
print(type(p).__name__)
Run Code Online (Sandbox Code Playgroud)
产生输出:
MagicMock
NonCallableMagicMock
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到一个特定的模拟器来判断_internal_classmethod
它所属的类何时不被嘲笑?
我正在开发我的第一个Python发行包.我在Python包装上的学习曲线似乎有所缓和,但我仍在努力解决一些悬而未决的问题.一个是我是否应该将我的单元测试与我的代码一起安装.
我理解在源代码分发中包含测试很重要.我想知道的是我是否应该将它们配置为安装?
我已经看到至少有一个流行的软件包似乎是故意这样做的(PyHamcrest),至少还有一个看起来是偶然的(行为).
所以我的(多部分)问题是:
将包单元测试与我的包代码一起安装是否有意义?
如果是这样,用例是什么?谁会使用它们,为了什么?也就是说,谁会使用那些不太乐意下载源代码并运行python setup.py test
呢?
他们将如何使用已安装的单元测试?喜欢import test; test.run()
或类似的东西?
python installation unit-testing software-distribution setuptools
我正在创建一个脚本来显示产品性能图表,并创建一个表格来显示其部件号、应用程序列表和当前应用程序的数量。
但是,默认字体大小太大,无法将所有这些信息放入幻灯片中,需要缩小。
如何在 Python-pptx 中减小表格中文本的字体大小?
这就是我所拥有的,但我不断收到错误消息“AttributeError: '_Cell' 对象没有属性 'paragraph'”
table = shapes.add_table(rows, cols, left + left_offset, top + Inches(.25), width, height - Inches(.25)).table
#column width
for i in range(3):
table.columns[i].width = col_width[i]
for i in range(len(a_slide)):
#color table
if i % 2 == 0:
for j in range(3):
fill = table.cell(i, j).fill
fill.background()
else:
for j in range(3):
fill = table.cell(i, j).fill
fill.solid()
fill.fore_color.rgb = RGBColor(240, 128, 128)
#populate table
table.cell(i, 0).text = str(item["name"])
try:
table.cell(i, 1).text = ", ".join(item["app"]) …
Run Code Online (Sandbox Code Playgroud) 我尝试使用python-docx创建Word文档。创建的文件的字母尺寸为8.5 x 11英寸。但在德国,标准格式为A4 8.27 x 11.69英寸。
from docx import Document
from docx.shared import Inches
document = Document()
document.add_heading('Document Title', 0)
document.settings
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')
document.add_paragraph(
'first item in unordered list', style='ListBullet'
)
document.add_paragraph(
'first item in ordered list', style='ListNumber'
)
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
document.add_page_break()
document.save('demo.docx') …
Run Code Online (Sandbox Code Playgroud) 我在我的python项目中使用pytest和mock.
当我得到涉及模拟对象(几乎所有这些)的测试失败时,回溯潜入模拟库源代码中,实际触发失败的代码经常滚动出视图.
有没有办法告诉py.test从回溯中排除已安装的库或类似的东西?噪音水平正在消除甜蜜的测试库.
我有一个包含 20 张幻灯片的现有 PowerPoint 演示文稿。此演示文稿用作模板,每张幻灯片都有不同的背景。我想使用这个(现有的)PowerPoint 演示文稿,在第 4 张幻灯片中插入一个图像(前 3 个不做任何处理)并将其另存为新的 PowerPoint 演示文稿。
这就是我到目前为止所拥有的。此代码加载现有演示文稿并将其另存为新演示文稿。现在我只需要知道如何使用它像上面描述的那样将图像插入第 4 号幻灯片。
注意:我使用的是普通的 Python。
from pptx import Presentation
def open_PowerPoint_Presentation(oldFileName, newFileName):
prs = Presentation(oldFileName)
#Here I guess I need to type something to complete the task.
prs.save(newFileName)
open_PowerPoint_Presentation('Template.pptx', 'NewTemplate.pptx')
Run Code Online (Sandbox Code Playgroud) 在变基期间,我经常希望查看当前正在应用的提交的消息,以帮助理解合并冲突。
我曾经跑过:
$ cat .git/rebase-apply/message
Run Code Online (Sandbox Code Playgroud)
这会给我很好的。但是,在我运行 git v2.20.1 的新机器上,该文件在变基期间不再存在。
我在哪里可以获得当前正在应用的提交的消息(当变基因合并冲突而暂停时)?
我有一个非常大的Python包,我写了大约3500个语句,有一个强大的单元和验收测试套件.我对代码本身的质量非常有信心,但是我对于软件包用户的安装过程顺利感到不安,因为我不知道如何在适当隔离的环境中可靠地测试安装,缺少像保持备用机器并在每次测试运行时使用全新的OS安装重新映像.
我怀疑以正确的方式使用virtualenv可能会为测试安装提供适当的测试夹具,但是在扩展的网络搜索之后没有发现任何有用的指导.
如何在开发机器上有效地测试setup.py和其他安装位?
python ×8
mocking ×2
python-docx ×2
python-pptx ×2
unit-testing ×2
api ×1
class ×1
class-method ×1
docx ×1
git ×1
installation ×1
ms-word ×1
powerpoint ×1
pytest ×1
python-3.x ×1
python-mock ×1
setup.py ×1
setuptools ×1