当我试图让类装饰器和方法装饰器很好地一起玩时,我遇到了这种行为.从本质上讲,方法装饰器会将某些方法标记为特殊的一些虚拟值,并且类装饰器将在之后出现并稍后填充该值.这是一个简化的例子
>>> class cow:
>>> def moo(self):
>>> print 'mooo'
>>> moo.thing = 10
>>>
>>> cow.moo.thing
10
>>> cow().moo.thing
10
>>> cow.moo.thing = 5
AttributeError: 'instancemethod' object has no attribute 'thing'
>>> cow().moo.thing = 5
AttributeError: 'instancemethod' object has no attribute 'thing'
>>> cow.moo.__func__.thing = 5
>>> cow.moo.thing
5
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么cow.moo.thing = 5不起作用,即使cow.moo.thing很清楚地给我10?为什么cow.moo.__func__.thing = 5有效?我不知道它为什么会这样,但是随机摆弄dir(cow.moo)列表中的东西试图让它起作用突然间,我不明白为什么.
我使用的小组一直在使用和开发一个Python包,为了这个问题的目的我会打电话给foobuilder.我们使用我们为用户提供的私有RPM和Deb存储库为Linux系统提供更新.
最近,一个公共包被添加到PyPi同名.它还被打包在公共Debian存储库以及其他地方.由于我们没有公开宣传我们的软件包,因此可以理解的是,已经弹出了具有相同名称的软件包.
这看起来像一个大问题,foobuilder因为在某个地方,用户可能会尝试foobuilder在公共foobuilder包安装在同一系统上时安装我们.
除了Python中的明显问题,我猜想将我们的存储库添加到Debian软件包管理器程序也可能会导致一些问题,尽管我还没有解决过这种情况.
由于我们foobuilder多年来一直在使用专利,因此存在大量代码import foobuilder并且希望获得我们的包,因此我认为更改名称是不可行的.
我已经考虑过改变包的名称my_foobuilder,并让它包含一个名为meta的软件包,它只包含一个foobuilder从中__init__.py导入所有内容的元数据包my_foobuilder.我可以指示新用户my_foobuilder直接导入.然后我可以开始弃用这个foobuilder名字了.最终,这将导致在相同的工作,如果我改foobuilder到my_foobuilder现在,因为每个人都需要被服务的更新和foobuilder名称不能在弃用炼狱永远.
Debian问题不应该太难解决; 我可以将debian软件包名称更改为my_foobuilder但仍然安装相同(冲突的)Python软件包.然后我可以在设置my_foobuilder包Conflict带foobuilder.它可能要求用户在他们的包管理器中摆弄,以便在转换期间让事情重回正轨,但我认为这不是什么大问题.但是,这会阻止用户同时使用公共foobuilder包.
有什么比我上面考虑的更容易或更好的方式来对待这种情况?我正在考虑的解决方案有什么问题吗?你会怎么处理这个?
题
似乎PyWin32很容易将以null结尾的unicode字符串作为返回值.我想以'正确'的方式处理这些字符串.
假设我得到一个字符串:u'C:\\Users\\Guest\\MyFile.asy\x00\x00sy'.这似乎是在Python unicode对象中挂出的C样式的以null结尾的字符串.我想把这个坏男孩修剪成一个常规的字符串,例如,我可以在窗口标题栏中显示.
在第一个空字节处修剪字符串是否正确处理它?
我没想到得到这样的返回值,所以我想知道我是否遗漏了一些关于Python,Win32和unicode如何一起玩的重要内容......或者这是否只是一个PyWin32错误.
背景
我正在使用GetOpenFileNameWPyWin32包中的Win32文件选择器函数.根据文档,此函数返回一个包含完整文件名路径的元组作为Python unicode对象.
当我打开具有现有路径和文件名集的对话框时,我得到一个奇怪的返回值.
例如,我将默认设置为: C:\\Users\\Guest\\MyFileIsReallyReallyReallyAwesome.asy
在对话框中,我将名称更改为MyFile.asy并单击"保存".
返回值的完整路径部分是:u'C:\ Users\Guest\MyFile.asy\x00wesome.asy'`
我期望它是: u'C:\\Users\\Guest\\MyFile.asy'
该函数返回一个循环缓冲区而不删除终止字节.不用说,我的其余代码没有设置为处理C样式的以null结尾的字符串.
演示代码
以下代码演示了GetSaveFileNameW返回值中以null结尾的字符串.
方向:在对话框中将文件名更改为"MyFile.asy",然后单击"保存".观察打印到控制台的内容.我得到的输出是u'C:\\Users\\Guest\\MyFile.asy\x00wesome.asy'.
import win32gui, win32con
if __name__ == "__main__":
initial_dir = 'C:\\Users\\Guest'
initial_file = 'MyFileIsReallyReallyReallyAwesome.asy'
filter_string = 'All Files\0*.*\0'
(filename, customfilter, flags) = \
win32gui.GetSaveFileNameW(InitialDir=initial_dir,
Flags=win32con.OFN_EXPLORER, File=initial_file,
DefExt='txt', Title="Save As", Filter=filter_string,
FilterIndex=0)
print repr(filename)
Run Code Online (Sandbox Code Playgroud)
注意:如果您没有足够缩短文件名(例如,如果您尝试MyFileIsReally.asy),则字符串将在没有空字节的情况下完成.
环境
Windows 7 Professional 64位(无服务包),Python 2.7.1,PyWin32 Build 216
更新:PyWin32 Tracker神器
基于我到目前为止收到的评论和答案,这可能是一个pywin32错误,所以我提交了一个跟踪器工件.
更新2:修复!
Mark Hammond在追踪器工件中报告说这确实是一个错误.一个修复程序已检入rev f3fdaae5e93d,所以希望这将成为下一个版本.
我认为Aleksi …
我的函数创建了一个生成器链:
def bar(num):
import itertools
some_sequence = (x*1.5 for x in range(num))
some_other_sequence = (x*2.6 for x in range(num))
chained = itertools.chain(some_sequence, some_other_sequence)
return chained
Run Code Online (Sandbox Code Playgroud)
我的功能有时需要以chained相反的顺序返回.从概念上讲,以下是我希望能够做到的:
if num < 0:
return reversed(chained)
return chained
Run Code Online (Sandbox Code Playgroud)
不幸:
>>> reversed(chained)
TypeError: argument to reversed() must be a sequence
Run Code Online (Sandbox Code Playgroud)
我有什么选择?
这是一些实时的图形渲染代码,所以我不想让它太复杂/慢.
编辑:当我第一次提出这个问题时,我没有考虑过发电机的可逆性.正如许多人所指出的那样,发电机无法逆转.
事实上,我想要扭转链条中扁平化的内容; 不仅仅是发电机的顺序.
根据响应,我没有单一的调用来反转itertools.chain,所以我认为这里唯一的解决方案是使用一个列表,至少在相反的情况下,也许两者都有.
我正在使用最新版本的PyGTK All-in-One安装程序(2.24.2)用于Python 2.7,其中包括Cairo 1.10.8,Pango 1.29.4,PyGTK 2.24.0和PyGobject 2.28.3(我认为) .
以下代码泄漏~55 MB的内存:
import gtk
window = gtk.Window()
label = gtk.Label()
window.add(label)
window.show_all()
for _ in range(100000):
label.set_markup('Leaking memory!')
while gtk.events_pending():
gtk.main_iteration()
Run Code Online (Sandbox Code Playgroud)
注意:for循环在我的测试脚本中,所以我可以看到任务管理器中的内存消耗增加.它本质上也是我真实应用程序中发生的事情,除了标签文本每秒至少更改一次,而不是每次都重写相同的文本.
问题是label.set_markup(),每次呼叫泄漏大约0.5kB,所以我怀疑问题出在GTK或Cairo的某个地方.正如评论者指出的那样,这可能是这个错误(685959).
我尝试使用objgraph来查看是否有任何额外的Python对象与调用次数成比例显示,gtk.Label.set_markup()但没有多余的对象.接下来,调用gc.collect()没有帮助,我试着确定.Python似乎并不知道负责内存消耗的对象.
我如何找到这个内存泄漏,和/或解决它?我需要使用标记来为这个应用程序设置一些文本的样式,但我尝试使用它gtk.Label.set_text()作为一种解决方法,它也会泄漏内存.
我应该注意到这个应用程序针对Windows,因此使用PyGObject来获取GTK 3不是一个选项 - 在Windows上仍然没有GObject内省.
如何在数组公式中使用嵌套的"AND"在"IF"内部工作?
我将我的问题减少到以下示例:
注意:上面的图片已经更新,包括数组公式花括号
在右上角,我们有L3("颜色")和L4("形状")的搜索条件.在左侧,D列包含项目列表中颜色和形状的工作匹配公式.第一个表显示匹配公式在不使用数组公式的情况下正常工作.
第二个表显示了与颜色匹配的数组公式.
第三个表显示了与形状匹配的数组公式.
在右边是我尝试在数组公式中使用这两个条件,通过将它们与AND组合.
如果颜色列中的值与颜色标准(L3)匹配,并且形状列中的值与形状标准(L4)匹配,那么我想看到"MATCH!".
我找到了一个解决方法:连接值和标准,然后在单个IF中匹配它们.我觉得应该有一个更好的方式...就像AND和预期的一样工作!
注意: 下面的许多答案都能正常工作,但不能作为数组公式,这就是这个问题的具体内容.我看了看原来的问题并意识到我忘了在数组公式示例中显示花括号.我已修复图像以显示它们.对困惑感到抱歉.
回答这些问题的关键是写一些作为数组公式的东西,在按公式输入单元格后按CTRL + SHIFT + ENTER输入.Excel将自动添加花括号以指示它是一个数组公式.
我的模型包含多对多关系.Measurements可以是任何数量的一部分DataSets.
# models.py
from django.db import models
class DataSet(models.Model):
purpose = models.TextField()
class Measurement(models.Model):
value = models.IntegerField()
sets = models.ManyToManyField(DataSet, null=True, blank=True,
verbose_name="datasets this measurement appears in")
Run Code Online (Sandbox Code Playgroud)
我希望我的管理界面能够Measurement在DataSet管理员中内联字段,就像TabularInline使用ForeignKey字段一样.这是我到目前为止:
# admin.py
from django.contrib import admin
from myapp.models import Measurement, DataSet
class MeasurementInline(admin.TabularInline):
model = Measurement.sets.through
class DataSetAdmin(admin.ModelAdmin):
inlines = [MeasurementInline]
admin.site.register(DataSet, DataSetAdmin)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到的只是带有"+"按钮的下拉框,打开了测量管理员.我希望实际的Measurement字段value在内联中公开.我尝试添加value到MeasurementInline上的字段列表:
# admin.py
class MeasurementInline(admin.TabularInline):
model = Measurement.sets.through
fields = ['value']
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:'MeasurementInline.fields' …
我正在尝试使用Python中的webdriver在 HTML表单中获取textarea的内容.
我收到了文字,但缺少换行符.该硒文档是几乎无用的; 他们说:
class selenium.webdriver.remote.webelement.WebElement(parent,id_)
[...]
text:获取元素的文本.
我目前正在做以下事情:
from selenium import webdriver
# open the browser and web site
b = webdriver.Firefox()
b.get('http://www.example.com')
# get the textarea element
textbox = b.find_element_by_name('textbox')
# print the contents of the textarea
print(repr(textbox.text))
Run Code Online (Sandbox Code Playgroud)
这将打印textarea内容的Python unicode字符串的表示形式,除了所有换行符已被空格替换.卫生署!
不确定我是否面临文本编码问题,selenium/webdriver错误(无法在跟踪器中找到它)或用户错误.
有没有不同的方法来做到这一点?
编辑:我只是尝试了Chrome ...工作正常.我向selenium的问题跟踪器报告了一个错误.Sam的解决方法(下面接受的答案)适用于Firefox,但有一点需要注意:符号在返回的字符串中转换为HTML实体代码.这没什么大不了的.
我正在使用PyGTK,试图提出一些小部件组合,它们将执行以下操作:
谢谢 - 我是GTK的新手.
我正在使用Gerrit Code审查.
我有一个问题.Gerrit有一些钩子,其中一个是:
patchset-created --change <change id> --change-url <change url>
--project <project name> --branch <branch> --uploader <uploader>
--commit <sha1> --patchset <patchset id>
Run Code Online (Sandbox Code Playgroud)
如果你对Gerrit进行一些更改,Gerrit会调用它.
传入的commit参数是sha1提交号,但我想要的是提交日志.例如,如果我这样做git commit -m "id:110",我想得到id:110.
我怎么才能得到它?我可以使用任何API吗?
我有一张桌子:
Person 列:
pID(PK)
FName
LName
plID(FK)
Run Code Online (Sandbox Code Playgroud)
另一张桌子Place:
plID(PK)
plCity
plState
plZip
Run Code Online (Sandbox Code Playgroud)
是不是更好,只是Person做了像:
pID(PK)
FName
LName
City
State
Zip
Run Code Online (Sandbox Code Playgroud)
例如:
John Doe New York, NY 00000
Jane Doe New York, NY 00000
Jim Doe New York, NY 00000
Run Code Online (Sandbox Code Playgroud)