小编Ste*_*der的帖子

在Python中向instancemethods添加属性

当我试图让类装饰器和方法装饰器很好地一起玩时,我遇到了这种行为.从本质上讲,方法装饰器会将某些方法标记为特殊的一些虚拟值,并且类装饰器将在之后出现并稍后填充该值.这是一个简化的例子

>>> 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 instance-method

33
推荐指数
1
解决办法
6520
查看次数

如何处理与公共名称冲突的专有Python包名称?

背景

我使用的小组一直在使用和开发一个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名字了.最终,这将导致在相同的工作,如果我改foobuildermy_foobuilder现在,因为每个人都需要被服务的更新和foobuilder名称不能在弃用炼狱永远.

Debian的

Debian问题不应该太难解决; 我可以将debian软件包名称更改为my_foobuilder但仍然安装相同(冲突的)Python软件包.然后我可以在设置my_foobuilderConflictfoobuilder.它可能要求用户在他们的包管理器中摆弄,以便在转换期间让事情重回正轨,但我认为这不是什么大问题.但是,这会阻止用户同时使用公共foobuilder包.

有什么比我上面考虑的更容易或更好的方式来对待这种情况?我正在考虑的解决方案有什么问题吗?你会怎么处理这个?

python debian naming packages

13
推荐指数
1
解决办法
1051
查看次数

如何以"正确"的方式处理具有空字节的Python unicode字符串?

似乎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 …

python unicode winapi pywin32

10
推荐指数
1
解决办法
4835
查看次数

如何反转itertools.chain对象?

我的函数创建了一个生成器链:

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,所以我认为这里唯一的解决方案是使用一个列表,至少在相反的情况下,也许两者都有.

python generator python-itertools

9
推荐指数
2
解决办法
5481
查看次数

重绘标签时,解决GTK中的大内存泄漏问题

我正在使用最新版本的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内省.

python gtk pygtk pango

8
推荐指数
1
解决办法
1063
查看次数

如何在Excel数组公式中使用嵌套IF(AND)?

如何在数组公式中使用嵌套的"AND"在"IF"内部工作?

我将我的问题减少到以下示例: Excel电子表格显示具有嵌套AND的数组公式 注意:上面的图片已经更新,包括数组公式花括号

在右上角,我们有L3("颜色")和L4("形状")的搜索条件.在左侧,D列包含项目列表中颜色和形状的工作匹配公式.第一个表显示匹配公式在不使用数组公式的情况下正常工作.

第二个表显示了与颜色匹配的数组公式.

第三个表显示了与形状匹配的数组公式.

在右边是我尝试在数组公式中使用这两个条件,通过将它们与AND组合.

如果颜色列中的值与颜色标准(L3)匹配,并且形状列中的值与形状标准(L4)匹配,那么我想看到"MATCH!".

我找到了一个解决方法:连接值和标准,然后在单个IF中匹配它们.我觉得应该有一个更好的方式...就像AND和预期的一样工作!

注意: 下面的许多答案都能正常工作,但不能作为数组公式,这就是这个问题的具体内容.我看了看原来的问题并意识到我忘了在数组公式示例中显示花括号.我已修复图像以显示它们.对困惑感到抱歉.

回答这些问题的关键是写一些作为数组公式的东西,在按公式输入单元格后按CTRL + SHIFT + ENTER输入.Excel将自动添加花括号以指示它是一个数组公式.

excel excel-formula array-formulas

8
推荐指数
2
解决办法
5万
查看次数

如何在ManyToMany关系中使用带有可编辑字段的TabularInline?

我的模型包含多对多关系.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)

我希望我的管理界面能够MeasurementDataSet管理员中内联字段,就像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' …

django many-to-many django-admin

7
推荐指数
1
解决办法
888
查看次数

如何使用webdriver获取textarea的文本内容?

我正在尝试使用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实体代码.这没什么大不了的.

python selenium webdriver

7
推荐指数
2
解决办法
8626
查看次数

哪个GTK小部件组合用于小部件的可滚动列?

我正在使用PyGTK,试图提出一些小部件组合,它们将执行以下操作:

  • 让我在一列中添加无数个小部件
  • 提供一个垂直滚动条以获取从底部运行的滚动条
  • 在调整窗口大小时,调整窗口小部件的宽度以填充可用的水平空间

谢谢 - 我是GTK的新手.

python gtk pygtk widget

4
推荐指数
1
解决办法
2971
查看次数

Gerrit hook API

我正在使用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吗?

gerrit

2
推荐指数
1
解决办法
3172
查看次数

我应该正常化还是去标准化?

我有一张桌子:

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)

mysql database database-design

2
推荐指数
1
解决办法
110
查看次数