tl;dr 在使用 Gerrit 较长时间并切换到 Bitbucket 后,我不禁觉得后者很糟糕。我认为这是因为我方面存在一些知识差距而不是软件本身,并且希望像使用 Gerrit 一样高效地使用它。
主要问题:追加到当前拉取请求并查看其历史记录
我最喜欢 Gerrit 的一点是它如何呈现变革历史。您只需git --commit --amend
按下它,它就会显示为新的补丁集。您可以轻松查看哪些注释添加到了哪些版本的更改中,您可以查看提交的任何两个补丁集之间的差异。当根据您的评论查看某人的更改时,您只能看到最新更改和第 n-1 个更改之间的差异,或者选择要比较的基线。我在 Bitbucket 中找不到任何类似的清晰内容。它有类似的功能还是我的工作流程错误?与审阅者迭代处理拉取请求的首选方法是什么?
其他小事
我真的很想喜欢 Bitbucket,但看起来这个工具不是为工程师/由工程师创建的。我很乐意用漂亮的界面或 JIRA 集成来换取更有用的差异工具或更好的审查流程。如果有人有类似的经历,我很高兴听到您如何将工作流程从 Gerrit 调整到 Bitbucket。
tl; dr Python重用ID吗?两个具有非重叠生命期的对象获得相同ID的可能性有多大?
背景:
我一直在研究一个复杂的项目,纯粹用Python 3编写.我一直在看测试中的一些问题,并花了很多时间寻找根本原因.经过一些分析后,我怀疑当测试作为一个整体运行时(它由一个专门的调度程序编排并运行),它会重用一些模拟方法,而不是用原始方法实现新对象.检查翻译是否重复使用我id()
.
问题:
id()
通常可以工作并显示对象标识符,并让我告诉我的调用何时创建新实例而不重用.但是如果两个对象相同的话,会发生什么?文件说:
返回对象的"标识".这是一个整数,在该生命周期内保证该对象是唯一且恒定的.具有非重叠寿命的两个对象可以具有相同的
id()
值.
问题:
解释器id()
什么时候可以重用值?是在它随机选择相同的内存区域时吗?如果它只是随机的,似乎极不可能,但它仍然无法保证.
有没有其他方法来检查我实际引用的对象是什么?我遇到了一个我有对象的情况,它有一个模拟的方法.该对象不再使用,垃圾收集器将其销毁.我创建相同类的新对象后,就得到了一个新的id()
,但该方法得到了相同的ID,当它被嘲笑为,它实际上是只是一个模拟.
有没有办法强制Python销毁给定的对象实例?从阅读中我看来没有,并且当它看不到对象的引用时它取决于垃圾收集器,但我认为无论如何都值得问.
我的问题是启用已禁用的监视器ChangeDisplaySettingsEx
.我想这不是火箭科学,但经过一些挖掘它仍然看起来不可能.我找到了一种基于此处的 Microsoft代码示例禁用所有辅助显示的方法.虽然它只需要基本的调整才能工作,但重新连接从未奏效.我想要做的是:
1.初始化DisplayDevice
BOOL FoundSecondaryDisp = FALSE;
DWORD DispNum = 0;
DISPLAY_DEVICE DisplayDevice;
LONG Result;
TCHAR szTemp[200];
int i = 0;
DEVMODE defaultMode;
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
Run Code Online (Sandbox Code Playgroud)
2.查找所有设备
while (EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0))
{
ZeroMemory(&defaultMode, sizeof(DEVMODE));
defaultMode.dmSize = sizeof(DEVMODE);
//point 3 goes here
}
Run Code Online (Sandbox Code Playgroud)
3.检测分离的设备
if (!(DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
Run Code Online (Sandbox Code Playgroud)
4.启用设备
DEVMODE DevMode;
ZeroMemory(&DevMode, sizeof(DevMode));
DevMode.dmSize = sizeof(DevMode);
DevMode.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
DevMode.dmPelsWidth = 1920;
DevMode.dmPelsHeight = 1080;
Result = ChangeDisplaySettingsEx(DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, …
Run Code Online (Sandbox Code Playgroud) 最近,我发现了XlsxWriter for Python(我很喜欢它!),我开始研究一些电子表格.我需要以编程方式创建一个与其他人手动创建的电子表格相同的电子表格.我设法创建了我需要的一切,除了在autofilter中排序表.基本上,我想创建这样的东西:
而我无法弄清楚如何.我的文档(检查1,2)并没有发现有关排序的任何信息.我现在做的是:
worksheet.autofilter(1, 0, known_lenght, known_width)
这导致自动过滤器箭头出现在标题单元格的右下角,但worksheet.autofilter()
似乎缺乏排序功能.我错过了什么或者没有选择在XlsxWriter中创建autofilter并在其中设置排序?谢谢!
None
让我们考虑这个示例 - 返回列表中第一个值的索引li
(如果存在)或最后一个元素的索引(如果None
不存在于li
.
我可以检查列表中是否有 None,但使用 ifs 不是首选方式 - Dive Into Python 鼓励使用异常,因为据说它们更快并使代码更清晰(请参阅此问题)。所以我采取了三种方法:
1.
try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1
print my_index
Run Code Online (Sandbox Code Playgroud)
my_index
在 try/ except 块内声明。更少的行数,没有多余的声明。可能的问题 - 不同的异常类型将导致不创建my_index
脚本并使其崩溃print
。
2.
my_index = None # or anything else
try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1
print my_index
Run Code Online (Sandbox Code Playgroud)
my_index
在 try/except 之前声明,并且无论发生什么异常都会分配一个值。缺点——更多的线条,看起来多余。
3. 编辑:不起作用 - 无论 try/ except 结果如何,finally 都会被执行
try: …
Run Code Online (Sandbox Code Playgroud)我浏览了几个关于在 Python 中计算文件校验和的主题,但没有一个主题回答了关于多个文件中的一个总和的问题。我在子目录中有几个文件,想确定其中一个或多个文件是否有任何更改。有没有办法从多个文件中生成一个总和?
编辑:这是我获取总和列表的方式:
checksums = [(fname, hashlib.md5(open(fname, 'rb').read()).digest()) for fname in flist]
Run Code Online (Sandbox Code Playgroud) tl;dr
如何捕获相同类型但具有不同消息的不同异常?
情况
在理想世界中,我会处理这样的异常:
try:
do_something()
except ExceptionOne:
handle_exception_one()
except ExceptionTwo:
handle_exception_two()
except Exception as e:
print("Other exception: {}".format(e))
Run Code Online (Sandbox Code Playgroud)
但是我使用的外部代码在我的使用中可能会抛出两个异常。两者都是ValueError
s 但有不同的信息。我想区分处理它们。这是我尝试采用的方法(为了更容易地表达我提出的想法AssertionError
):
try:
assert 1 == 2, 'test'
except AssertionError('test'):
print("one")
except AssertionError('AssertionError: test'):
print("two")
except Exception as e:
print("Other exception: {}".format(e))
Run Code Online (Sandbox Code Playgroud)
但这段代码总是到最后print()
并给我
Other exception: test
Run Code Online (Sandbox Code Playgroud)
有没有办法以这种方式捕获异常?我假设这是可能的,因为 Python 允许我在捕获异常时指定 MESSAGE,ExceptionType('MESSAGE')
但实际上我没有设法让它工作。我也没有在文档中找到明确的答案。
我想创建一个脚本来移动一些(或全部)单元格。这是我的代码想法,但我不知道如何实现最后一行(向右移动 5 个单元格的示例):
new_rows = []
for row in ws.rows:
new_rows.append((None,) * 5 + row)
ws.rows = new_rows
Run Code Online (Sandbox Code Playgroud) 我在 中创建了一个虚拟模块模块/tmp
,insert
它的路径 do sys.path
,导入虚拟模块,del
当它不再需要时,删除它sys.path
,我仍然可以导入它。为什么?
考虑这个 pytest 夹具代码及其注释:
def test_function(temp_dir):
with open(os.path.join(temp_dir, 'dum.py'), 'w') as f:
f.write("""
class A:
\"\"\"
test docstring
\"\"\"
test: int
test_2: str = "asdf"
class B(A):
pass
""")
import sys
sys.path.insert(1, temp_dir)
assert temp_dir in sys.path # assertion passes
# noinspection PyUnresolvedReferences
import dum # import successful
yield dum
# teardown executed after each usage of the fixture
del dum # deletion successful
sys.path.remove(temp_dir) # …
Run Code Online (Sandbox Code Playgroud) 问题:如何有效地和python地将列表列表my_list
转换为dict,my_dict
以便每个嵌套列表的第0个元素是键,其余元素是值(也是列表).
例:
输入:
my_list = [['a', 'b'],
['b', 'c', 'd', 'e', 'f'],
['g'],
['h', 'i', 'j'],
['k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']]
Run Code Online (Sandbox Code Playgroud)
输出:
my_dict = {'a': ['b'],
'b': ['c', 'd', 'e', 'f'],
'g': None,
'h': ['i', 'j'],
'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']}
Run Code Online (Sandbox Code Playgroud)
附注: 我的数据集非常庞大,因此该方法需要清洁高效.虽然迭代列表是可以接受的,但我宁愿避免嵌套循环(以保持O(n)复杂性).我设法编写了一个函数,通过迭代输入列表并弹出第0个元素来完成工作,但弹出本身是O(n),使整个解O(n*n).