闭包是一种非常有用的语言功能.他们让我们做一些聪明的事情,否则会占用大量代码,并且经常使我们能够编写更优雅,更清晰的代码.在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中存在一个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.red
是False
因为Signal.red
不是一个字符串.
Signal(brain_detected_colour) is Signal.red
失败了ValueError: 'red' is not a valid Signal
.
我原本以为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) 我一直在阅读hg bisect
和有趣的是能够知道哪个版本引入了一个错误,但我想知道人们使用这些信息的原因.我唯一能想到的是尝试缩小哪些日期可能需要数据修复,如果它是导致某种形式的无效数据的错误.
更新: 我想在发布之前我完全误解了目的.我在想我会进行调试,找到引入错误的行,然后使用bisect.似乎bisect是一种方式让我不必花时间猜测bug可能在哪里并放置断点或记录.相反,我应该编写一个现在失败的小测试,传入过去的修订版并让二等分告诉我问题的来源.
假设我有一个字典,我想检查一个键是否映射到非空值.执行此操作的一种方法是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中有什么方法可以使用元组作为切片的索引吗?以下内容无效:
>>> 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) 假设我有以下字符串:
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中的其他空对象评估为False - 我如何才能获得迭代器/生成器呢?
此代码抛出异常,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) 我有几种具有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]
并且没有错误,我在我的选择中获得了三种组织类型...
python ×8
arrays ×1
bisect ×1
boolean ×1
closures ×1
coding-style ×1
dictionary ×1
dvcs ×1
enums ×1
foreach ×1
generator ×1
inheritance ×1
iterator ×1
list ×1
mercurial ×1
odoo-8 ×1
openerp ×1
python-3.6 ×1
python-3.x ×1
readonly ×1
reference ×1
replace ×1
slice ×1
string ×1
superclass ×1
tuples ×1