*以下代码(在pprint库中找到)的含义是什么?
def pformat(object, indent=1, width=80, depth=None, *, compact=False):
"""Format a Python object into a pretty-printed representation."""
return PrettyPrinter(indent=indent, width=width, depth=depth,
compact=compact).pformat(object)
Run Code Online (Sandbox Code Playgroud)
如果是*args那么它将是任意数量的位置参数.参数值将在名为的元组中args.前4个参数可以按名称或按位置compact分配,参数只能按名称分配...
好吧,不!因为它不符合文档:
在函数调用中,关键字参数必须遵循位置参数.
那么,明星在其他命名参数之前和之后做了什么?那是怎么用的?或者为什么不使用它?
运行以下代码的第一行后,Excel 会更改用户界面中的“匹配整个单元格内容”设置。结果是,下次用户按下Ctrl+F 时,将在整个单元格内容中进行搜索。我不喜欢改变影响用户体验的设置的 VBA 宏,所以我总是执行第二行,它执行另一个搜索并将匹配整个单元格内容设置回其默认值。
'execute the find and changes the entire cell content setting
Set C = MyRange.Find(SomeText, LookAt:=xlWhole)
'put the setting back to the default value (not the previous value)
MyRange.SomeText ParName, LookAt:=xlPart
Run Code Online (Sandbox Code Playgroud)
问题是它将它设置回默认值,而不是用户最后设置的值。
我宁愿有类似的东西:
'store the current entire cell content setting
OldLookAt = Application.FindLookAt
'execute the find
Set C = MyRange.Find(SomeText, LookAt:=xlWhole)
'restore the original setting
Application.FindLookAt = OldLookAt
Run Code Online (Sandbox Code Playgroud)
我编的,Application.FindLookAt因为我找不到它。
有没有办法在Range.Find不影响用户体验的情况下做某事?
有没有一种方法可以比较两个几何形状(或任何两个其他通用数据结构),而当涉及公差时不使用蛮力?
蛮力(将每个对象的每个值与另一个对象的每个值进行比较)有效,但速度很慢,我无法使用它。
我尝试对数据进行排序并比较两个排序的集合。它的速度很快,但只能在零公差下使用。一旦增加公差,我就会迷失方向。问题是当我比较时两个值可以相同,而当我排序时两个值可以不同。
这是我的问题的一些细节。
在我的Excel VBA加载项中,我有一个Shape对象集合,每个Line对象由两个Point对象组成。外接程序通过COM扫描CAD图并创建Shape对象的集合。
简化版本可能会生成以下内容:
Shape 1 Shape 2
Point 1 0.0 5.0 0.0 4.9
Point 2 4.9 0.0 5.1 0.0
Point 3 5.0 5.0 5.0 5.0
Run Code Online (Sandbox Code Playgroud)
我需要找出哪些形状与哪些形状相同,相同的方法具有相同的形状,大小和方向,但位置不同(到目前为止是微不足道的)加上或减去公差(现在不那么微不足道!)
的 Point.IsIdenticalTo(OtherPoint)定义为:
Function IsIdenticalTo(OtherPoint As Point) As Boolean
IsIdenticalTo = Abs(X - OtherPoint.X) < Tolerance And Abs(Y - OtherPoint.Y) < Tolerance
End Function
Run Code Online (Sandbox Code Playgroud)
暴力执行 Shape.IsIdenticalTo(OtherShape)作品但速度太慢:如果每个作品Line(I)都相同OtherShape.Line(J),反之亦然,那么这两个形状是相同的。有时我有数百个形状,每个形状都有数百条线,因此强力解决方案对我不起作用。
我尝试了两种涉及排序集合的方法。两者都是快速的,因为比较两个排序的集合比蛮力方式要快,但是在某些情况下都失败了:
一个SortedValues集合包含所有的所有行的X和Y值。这些值已排序,因此有关该值是X还是Y的信息都会丢失。我使用这种方法已经有几个月没有问题了,但是例如当两个形状之间的唯一区别是在点(10, 20)和之间时,它就失败了(20, 10)。我将线角添加到值列表中,情况有所改善,但是仍然存在这种方法失败的情况,因为在对值进行排序时会丢失一些信息。在上面的示例中,此方法适用于以下集合:
Shape …Run Code Online (Sandbox Code Playgroud)我已经在所有内部应用程序上广泛使用自定义协议来打开任何类型的文档(CAD,CAM,PDF等),打开文件资源管理器并选择特定文件,并运行其他应用程序。
多年前,我定义了一个myprotocol协议,C:\Windows\System32\wscript.exe该协议通过传递VBScript的名称以及每个请求具有的参数来执行。传递给脚本的第一个参数描述动作的类型(OpenDocument,ShowFileInFileExplorer,ExportBOM等),下面的参数被传递给动作。
直到去年wscript.exe停止工作时,一切都运转良好(有关详细信息,请参见此处)。我将问题复制到来解决wscript2.exe。现在,创建副本是我们所有计算机的标准配置中的一个步骤,现在使用该副本是wscript2.exe我们自定义协议的正式配置。(我们的防病毒客户支持找不到与交互的任何内容wscript.exe)。
今天,在构建新计算机之后,我们发现:
wscript2.exe。如果单击自定义协议链接,然后单击浏览按钮并打开该文件夹,则只会看到一小部分.exe文件,其中包括wscript.exe,但不包括wscript2.exe(我不知道这个问题最近有多久,因为我不要亲自使用FireFox)。wscript.exe,但仍然无法正常工作(行为与我之前链接的上一篇文章中所述的相同)wscript2.exe,但现在总是要求您进行确认。根据本文的说法,这似乎是新方法,并且情况很快可能会再次发生变化。每次单击确认框对我的用户来说都是一个很大的禁忌。这会减慢许多工作流程,这些工作流程需要快速单击页面上的数百个链接,例如,查看在大型工程图中缩放到一个几何图形的CAD应用程序。去年,我已经解决了一个问题,现在我正在处理另一个问题,阅读该文章使我感到恐惧,并使我认为很快就会出现更多问题。
所以这是一个问题:除了使用自定义协议,还有其他选择吗?
我不在开发供公众消费的Web应用程序。我的自定义协议需要VBScript文件,脚本使用的应用程序以及大量的网络共享文件夹。它们仅在我们的内部网络中使用,并且使用它们的计算机是手动配置的。
我正在开发一个与 COM 服务器交换对象的 Excel VBA 插件,如下所示:
'get an array of objects
Dim Ents() As ISomething
ComObject.GetEntities Ents
'send an array with 10 objects
ReDim Ents(9)
Set Ents(0) = ...
...
ComObject.SetEntities Ents
Run Code Online (Sandbox Code Playgroud)
获取数组效果很好:如果数组包含对象,它会按预期工作,如果数组为空,那么UBound(Ents) = -1一切都会按预期工作。
发送数组仅适用于非空数组,因为我不能Redim Ents(-1),并且EraseVBA 和 COM 服务器崩溃:Debug.Print UBound(Ents)在 VBA 中崩溃,谁知道是什么导致服务器崩溃。
看起来该Erase语句使数组未定义/损坏而不是空。
编辑(对下面评论的澄清):
执行此代码会崩溃,因为它无法计算UBound:
Sub Test()
Dim Ents() As ISmartId
Debug.Print UBound(Ents)
End Sub
Run Code Online (Sandbox Code Playgroud)
但是,如果添加Ents到监视窗口,然后在该行设置断点Debug.Print并执行,调试器会ISmartId(0 to -1)在“类型”列中显示 。此后,执行继续而不会崩溃,并且“调试”窗口显示预期的-1. …
下面的前三个查询返回正确的数字,而最后一个查询返回错误的数字。它应该返回 153,而不是返回 8193。我不知道这个数字来自哪里。
迭代查询正确返回 153 条记录。
>>> Project.select().where(Project.number.between('2012-01', '2012-02')).count()
75
>>> Project.select().where(Project.number.between('2012-02', '2012-03')).count()
78
>>> Project.select().where(Project.number.between('2012-01', '2012-03')).count()
153
>>> (Project.select().where(Project.number.between('2012-01', '2012-02')) |
Project.select().where(Project.number.between('2012-01', '2012-03'))).count()
8193
Run Code Online (Sandbox Code Playgroud)
编辑
这是一个从空数据库开始重现问题的函数。
def test(self):
db = peewee.SqliteDatabase('test.db', check_same_thread=False)
class Test(peewee.Model):
num = peewee.IntegerField()
class Meta:
database = db
Test.drop_table(True)
Test.create_table(True)
for i in range(1, 11):
Test.create(num=i)
q = Test.select().where(Test.num > 6) | Test.select().where(Test.num > 7)
print(q)
print('Count =', q.count())
for i in q:
print(i.num)
Run Code Online (Sandbox Code Playgroud)
这是它的输出。它表明迭代正确返回 4 个项目,但计数错误:
<class 'DocFinder.DocFinder.DocFinder.test.<locals>.Test'> SELECT t2."id", t2."num" FROM "test" AS …Run Code Online (Sandbox Code Playgroud) 我正在使用 Cherrypy 和 Peewee 开发一个应用程序,我想知道我的方法是好的还是错误的和危险的。
我发现的所有 Peewee 类的示例都只有Meta子类和<xxx>Field属性。我从来没有找到一个带有辅助方法或属性的例子。
我试着自己做,它奏效了!
它工作得很好,我觉得它很方便,但我担心我会遇到麻烦。
所以我的问题是:我可以向从 派生的类中添加尽可能多的属性和方法peewee.Model,这样我就可以像下面的代码片段那样做很酷的事情吗?
或者我可以做什么有限制和指导方针吗?
class PeeweeModel(peewee.Model):
class Meta:
database = db
class TempFile(PeeweeModel):
file_type = peewee.IntegerField()
original_file_name = peewee.CharField()
temp_file_name = peewee.CharField()
DRAWING = 1
PDF = 2
def href(self, settings):
if(self.file_type == DRAWING:
return self.temp_file_name
elif(self.file_type == PDF:
if settings.show_pdf:
return self.temp_file_name
elif settings.show_bitmap:
bitmap = TempFile.create_bitmap_from_pdf(self.temp_file_name)
return bitmap.temp_file_name
@staticmethod
def create_bitmap_from_pdf(self, file_name):
[...]
Run Code Online (Sandbox Code Playgroud)
编辑:
我将不胜感激有关构造函数的评论。
例如,我想做这两个:
tmp = TempFile(file_name) # and run my …Run Code Online (Sandbox Code Playgroud) 以下代码运行良好,但如果从具有错误消息的CherryPy应用程序方法执行,则会失败CoInitialize has not been called:
import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
xl.quit()
Run Code Online (Sandbox Code Playgroud)
这篇文章提出了一个适合我的解决方案:
import pythoncom
pythoncom.CoInitialize()
Run Code Online (Sandbox Code Playgroud)
我问的问题是我已经有一个解决方案的原因是(1)我想知道我在做什么(而不是仅仅因为我看过它曾经工作过)和(2) )我不想冒险错过重要的事情(阅读这篇文章让我觉得我错过了一些东西.)
我找不到任何文档pythoncom.CoInitialize(),pythoncom的源代码是以下三行对我没有帮助(Eclipse + pydev也没有说明该方法不存在):
# Magic utility that "redirects" to pythoncomxx.dll
import pywintypes
pywintypes.__import_pywin32_system_module__("pythoncom", globals())
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用匀称来识别形状所使用的区域以及将在CNC路由器上切割它的工具所使用的区域.使用ezdxf从dxf图形导入形状.
刀具路径可以是矩形(如果它们由沿直线的锯盘切割)或一组段(如果它们由铣削刀头布线).在这两种情况下,我都可以使用LineString.buffer()自动创建偏移并找到工具使用的区域.
我使用的形状很合理,因为我认为它是最好的工具,可以找出形状是否相互重叠(使用union()将所有工具合并为一个形状并overlaps()找到干涉).如果有更好的工具用于此目的,请告诉我.
buffer() 在创建用于表示角落弧线的线段方面做得很好.
有没有办法创建段来表示形状本身的弧?
例如,如何在此形状的左侧创建圆弧?我需要创建自己的(慢)python函数吗?还是有优化的匀称方式?

我仍然维护着许多旧的 VB6 应用程序,其中一些是 ActiveX Dll Implements IDTExtensibility2。
今天,我在 Windows 10 上打开其中一个,尝试运行它,该行Implements IDTExtensibility2突出显示,并出现消息“编译错误:Visual Basic 不支持自动化类型”。
我使用 Windows 7 创建了 VirtualBox,安装了 VB6,并且相同的项目运行没有问题。
我已经使用 Windows 10 好几个月了,我不太可能从未打开过任何旧的 ActiveX Dll 项目,但我不记得是否打开过。我的感觉是,我做到了,它正在工作,最近被破坏了,但我不确定,因为它们是旧项目,我很少打开它们,以进行最少的维护。
不幸的是我仍然需要维护那些古董。我需要在Windows 7虚拟机中进行维护吗?或者我有机会让它在 Windows 10 中运行吗?
python ×5
vba ×3
peewee ×2
activex ×1
algorithm ×1
arrays ×1
cherrypy ×1
comparison ×1
excel ×1
geometry ×1
python-3.x ×1
shapely ×1
shapes ×1
sqlite ×1
syntax ×1
url-scheme ×1
vb6 ×1
win32com ×1
windows-10 ×1
wsh ×1