小编Eth*_*man的帖子

读/写Python闭包

闭包是一种非常有用的语言功能.他们让我们做一些聪明的事情,否则会占用大量代码,并且经常使我们能够编写更优雅,更清晰的代码.在Python 2.x中,闭包变量名不能反弹; 也就是说,在另一个词法范围内定义的函数不能some_var = 'changed!'对其局部范围之外的变量执行某些操作.有人可以解释为什么会这样吗?在某些情况下,我想创建一个在外部作用域中重新绑定变量的闭包,但这是不可能的.我意识到在几乎所有情况下(如果不是全部的话),这种行为可以通过类来实现,但它通常不是那么干净或优雅.为什么我不能用闭包来做?

以下是重新绑定闭包的示例:

def counter():
    count = 0
    def c():
        count += 1
        return count
    return c
Run Code Online (Sandbox Code Playgroud)

这是您调用它时的当前行为:

>>> c()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in c
UnboundLocalError: local variable 'count' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

我想要它做的是:

>>> c()
1
>>> c()
2
>>> c()
3
Run Code Online (Sandbox Code Playgroud)

python closures language-design readonly

34
推荐指数
6
解决办法
4173
查看次数

如何将字符串与python枚举进行比较?

我刚刚发现python中存在一个Enum基类,我试图想象它对我有用.

假设我定义了一个红绿灯状态:

from enum import Enum, auto

class Signal(Enum):
    red = auto()
    green = auto()
    orange = auto()
Run Code Online (Sandbox Code Playgroud)

假设我从程序中的某个子系统接收信息,例如以表示颜色名称的字符串的形式brain_detected_colour = "red".

如何将此字符串与我的红绿灯信号进行比较?

显然,brain_detected_colour is Signal.redFalse因为Signal.red不是一个字符串.

Signal(brain_detected_colour) is Signal.red失败了ValueError: 'red' is not a valid Signal.

python enums python-3.6

29
推荐指数
3
解决办法
2万
查看次数

Python列表和for-access访问(在内置列表中查找/替换)

我原本以为Python是一种纯粹的传递引用语言.

来自C/C++我不禁想到内存管理,而且很难把它从我的头脑中解脱出来.因此,我试图从Java的角度来考虑它,并将所有内容都考虑在内,而不是原始内容作为参考传递.

问题:我有一个列表,其中包含一组用户定义类的实例.

如果我使用for-each语法,即:

for member in my_list:
    print(member.str);
Run Code Online (Sandbox Code Playgroud)

是否member相当于对象的实际引用?

它是否相当于:

i = 0
while i < len(my_list):
    print(my_list[i])
    i += 1
Run Code Online (Sandbox Code Playgroud)

我认为不是,因为当我想要替换时,它不起作用,也就是说,这不起作用:

for member in my_list:
    if member == some_other_obj:
        member = some_other_obj
Run Code Online (Sandbox Code Playgroud)

在列表中进行简单的查找和替换.可以在for-each循环中完成,如果是,怎么做?另外,我是否只需要使用随机访问语法(方括号),或者什么都不会工作,我需要删除该条目,并插入一个新条目?即:

i = 0
for member in my_list:
   if member == some_other_obj:
      my_list.remove(i)
      my_list.insert(i, member)
   i += 1
Run Code Online (Sandbox Code Playgroud)

python foreach replace reference list

26
推荐指数
3
解决办法
11万
查看次数

Mercurial bisect的优点是什么?

我一直在阅读hg bisect和有趣的是能够知道哪个版本引入了一个错误,但我想知道人们使用这些信息的原因.我唯一能想到的是尝试缩小哪些日期可能需要数据修复,如果它是导致某种形式的无效数据的错误.

更新: 我想在发布之前我完全误解了目的.我在想我会进行调试,找到引入错误的行,然后使用bisect.似乎bisect是一种方式让我不必花时间猜测bug可能在哪里并放置断点或记录.相反,我应该编写一个现在失败的小测试,传入过去的修订版并让二等分告诉我问题的来源.

version-control mercurial dvcs bisect

25
推荐指数
2
解决办法
5169
查看次数

检查字典中的值是否已定义/长度为零的最Pythonic方式

假设我有一个字典,我想检查一个键是否映射到非空值.执行此操作的一种方法是len函数:

mydict = {"key" : "value", "emptykey" : ""}
print "True" if len(mydict["key"]) > 0 else "False"  # prints true
print "True" if len(mydict["emptykey"]) > 0 else "False"  # prints false
Run Code Online (Sandbox Code Playgroud)

但是,可以依赖Python的语义,以及如果定义了一个对象,它的计算结果为true,并省略了len调用:

mydict = {"key" : "value", "emptykey" : ""}
print "True" if mydict["key"] else "False"  # prints true
print "True" if mydict["emptykey"] else "False"  # prints false
Run Code Online (Sandbox Code Playgroud)

但是,我不确定哪个更像Pythonic.第一种感觉"显性比隐性更好",然而第二种感觉"简单比复杂更好".

我也想知道,如果我正在使用的dict不一定包含字符串,但是可以包含其他可以使用的类型(列表,集合等),那么抛弃len调用是否会让我感到困惑.OTOH,在前者(使用len调用)如果None被存储为值,代码将被炸毁,而非len版本将按预期工作(将eval为false).

哪个版本更安全,更Pythonic?

编辑:澄清假设:我知道密钥在字典中,我知道值是可以使用的.我也无法避免让零长度值进入字典.

编辑#2:似乎人们忽略了我的问题.我不是要确定检查字典中是否存在键的最Pythonic /最安全的方法,我正在尝试检查值是否为零长度

python dictionary coding-style

25
推荐指数
2
解决办法
4万
查看次数

使用元组创建切片

在python中有什么方法可以使用元组作为切片的索引吗?以下内容无效:

>>> a = range(20)
>>> b = (5, 12)   # my slice indices
>>> a[b]          # not valid
>>> a[slice(b)]   # not valid
>>> a[b[0]:b[1]] # is an awkward syntax
[5, 6, 7, 8, 9, 10, 11]
>>> b1, b2 = b
>>> a[b1:b2]      # looks a bit cleaner
[5, 6, 7, 8, 9, 10, 11]
Run Code Online (Sandbox Code Playgroud)

这似乎是一个合理的pythonic语法,所以我很惊讶,我不能这样做.

(更新)解决方案原来是:

>>> a[slice(*b)]
[5, 6, 7, 8, 9, 10, 11]
Run Code Online (Sandbox Code Playgroud)

python arrays tuples slice python-3.x

20
推荐指数
2
解决办法
6601
查看次数

Python - 如何在Python中剪切字符串?

假设我有以下字符串:

http://www.domain.com/?s=some&two=20
Run Code Online (Sandbox Code Playgroud)

我怎样才能取消&包括以下内容&并拥有此字符串:

http://www.domain.com/?s=some
Run Code Online (Sandbox Code Playgroud)

python string

18
推荐指数
3
解决办法
11万
查看次数

如何在耗尽时让生成器/迭代器评估为False?

Python中的其他空对象评估为False - 我如何才能获得迭代器/生成器呢?

python iterator boolean generator

16
推荐指数
2
解决办法
3576
查看次数

调用重写方法,超类调用重写方法

此代码抛出异常,AttributeError,"wtf!" ,因为A.foo()是打电话B.foo1(),不应该打电话A.foo1()吗?如何强制它调用A.foo1()(内部的任何方法调用A.foo()都应该调用A.*)

class A(object):
    def foo(self):
        print self.foo1()

    def foo1(self):
        return "foo"

class B(A):
    def foo1(self):
        raise AttributeError, "wtf!"

    def foo(self):
        raise AttributeError, "wtf!"

    def foo2(self):
        super(B, self).foo()

myB = B()
myB.foo2()
Run Code Online (Sandbox Code Playgroud)

python inheritance superclass

15
推荐指数
3
解决办法
2万
查看次数

Odoo 8:Many2many域名过滤器

我有几种具有many2many关系的组织类型,描述哪些类型可能是其他类型的父类型(例如,部门可以是子部门和工作组的父级).它不是一个严格的层次结构(工作组可以是其他工作组的父级),因此有很多关系.

我的organization_type对象上有两个字段:allowed_parent_type_ids反之allowed_children_type_ids.

现在,我想根据组织对象的父级限制组织对象上的组织类型字段,因此"部门"的子级只能选择允许为部门子级的组织类型,依此类推.

在我的表单视图中,我试过:

<field
    name="organization_type_id"
    domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids)]"
    />
Run Code Online (Sandbox Code Playgroud)

我还试图在我的组织对象上放置一个允许类型的相关字段,但我总是会收到一条错误消息.我的最后一次尝试是:

domain=[('id', 'in', allowed_type_ids)]
Run Code Online (Sandbox Code Playgroud)

这给出了一条错误消息:

TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)

客户端实际上提取了一个JSON对象,如"allowed_type_ids"= [0,1,2]并且如果我在域表达式中替换allowed_type_ids [0,1,2]并且没有错误,我在我的选择中获得了三种组织类型...

openerp odoo-8

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