这个问题不是在迭代过程中Dictionary更改大小的重复-代码在Py2中有效,而在Py3中无效。这个问题问为什么不对此强制执行list
,而不是如何修复代码。
Python将愉快地执行
li = [1, 2, 3]
for n in li:
if n % 2 == 0:
li.remove(n)
Run Code Online (Sandbox Code Playgroud)
但是,如果我们尝试使用字典:
a = {1: '', 2: '', 3: ''}
for n in a:
if n % 2 == 0:
a.pop(n)
Run Code Online (Sandbox Code Playgroud)
我们得到
RuntimeError: dictionary changed size during iteration
Run Code Online (Sandbox Code Playgroud)
因为我假设这是实现细节,所以我会注意到这已经在CPython 3.7.0和3.4.2中进行了测试。
mypy
版本0.910
考虑
d = {
'a': 'a',
'b': {
'c': 1
}
}
d['b']['d'] = 'b'
Run Code Online (Sandbox Code Playgroud)
将其提供给mypy
结果
error: Unsupported target for indexed assignment ("Collection[str]")
Run Code Online (Sandbox Code Playgroud)
mypy
放置推断错误类型的一侧d
(它显然不是字符串集合),添加一个非常基本的显式类型d
修复此问题:
d: dict = {
... # same as above
}
Run Code Online (Sandbox Code Playgroud)
Success: no issues found in 1 source file
Run Code Online (Sandbox Code Playgroud)
我觉得这很奇怪。mypy
绝对应该能够推断出这d
是一个没有d: dict
.
假设我有一堂课
class A:
def method(self):
return self
Run Code Online (Sandbox Code Playgroud)
如果method
被调用,是指向A
要返回的对象的指针,还是对象的副本?
我已经在SO上阅读了几个相关的问题,但没有设法找到一个有效的解决方案.
我有一个带有这个简化代码的Flask服务器:
app = Flask(__name__)
api = Api(app)
class SendMailAPI(Resource):
def post(self):
print request.files
return Response(status=200)
api.add_resource(SendMailAPI, '/')
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
Run Code Online (Sandbox Code Playgroud)
然后在客户端:
# coding:utf-8
import requests
eng_file_name = 'a.txt'
heb_file_name = u'?.txt'
requests.post('http://localhost:5000/', files={'file0': open(eng_file_name, 'rb')})
requests.post('http://localhost:5000/', files={'file0': open(heb_file_name, 'rb')})
Run Code Online (Sandbox Code Playgroud)
当发送带有非utf-8文件名的第一个请求时,服务器接收带有文件的请求并打印ImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)])
,但是当发送带有utf-8文件名的文件时,服务器似乎在打印时没有收到该文件ImmutableMultiDict([])
.
我正在使用请求,2.3.0
但问题并没有解决最新版本(2.8.1
),Flask版本0.10.1
和Flask-RESTful版本0.3.4
.
我已经完成了一些requests
代码挖掘并且请求似乎已发送正常(即使用该文件),并且我在发送之前打印了请求,并且看到文件名确实编码为RFC2231:
--6ea257530b254861b71626f10a801726
Content-Disposition: form-data; name="file0"; filename*=utf-8''%D7%90.txt
Run Code Online (Sandbox Code Playgroud)
总结一下,我不完全确定问题是否在于requests
没有正确地将文件附加到请求,或者是否Flask
存在拾取具有根据RFC2231编码的文件名的文件的问题.
更新:在requests
GitHub中遇到过这个问题:https://github.com/kennethreitz/requests/issues/2505
我看到的所有内容都是关于列表的,但这是关于events = queue.queue()
哪个队列包含我想要提取的对象,但是我将如何从该队列中获取最后 N 个元素?
我不知道如何匹配一个字符串,但如果它有一个尾随换行符 ( \n
),它似乎自动剥离了:
import re
print(re.match(r'^foobar$', 'foobar'))
# <_sre.SRE_Match object; span=(0, 6), match='foobar'>
print(re.match(r'^foobar$', 'foobar\n'))
# <_sre.SRE_Match object; span=(0, 6), match='foobar'>
print(re.match(r'^foobar$', 'foobar\n\n'))
# None
Run Code Online (Sandbox Code Playgroud)
对我来说,第二种情况也应该返回None
.
当我们用$
, like设置模式的结尾时^foobar$
,它应该只匹配一个字符串 like foobar
,而不是foobar\n
。
我错过了什么?
我正在读一个文件(在做一些昂贵的逻辑时),我需要在不同的函数中迭代几次,所以我真的只想读取和解析文件一次.
解析函数解析文件并返回一个itertools.groupby
对象.
def parse_file():
...
return itertools.groupby(lines, key=keyfunc)
Run Code Online (Sandbox Code Playgroud)
我考虑过做以下事情:
csv_file_content = read_csv_file()
file_content_1, file_content_2 = itertools.tee(csv_file_content, 2)
foo(file_content_1)
bar(file_content_2)
Run Code Online (Sandbox Code Playgroud)
但是,itertools.tee
似乎只能"复制"外部迭代器,而内部(嵌套)迭代器仍然引用原始(因此在迭代返回的第一个迭代器后它将耗尽itertools.tee
).
独立MCVE:
from itertools import groupby, tee
li = [{'name': 'a', 'id': 1},
{'name': 'a', 'id': 2},
{'name': 'b', 'id': 3},
{'name': 'b', 'id': 4},
{'name': 'c', 'id': 5},
{'name': 'c', 'id': 6}]
groupby_obj = groupby(li, key=lambda x:x['name'])
tee_obj1, tee_obj2 = tee(groupby_obj, 2)
print(id(tee_obj1))
for group, data in tee_obj1:
print(group)
print(id(data))
for i …
Run Code Online (Sandbox Code Playgroud) 尝试将 str 转换为日期,例如“2017-8-27”
我的代码:
from datetime import datetime as dt
import datetime, collections
date = dt.strptime('2017-8-27', '%Y-%-m-%-d')
Run Code Online (Sandbox Code Playgroud)
但我看到以下消息:
'-' 是格式为 '%Y-%-m-%-d' 的错误指令
并且不明白什么是不正确的。我该如何解决?
提前致谢,
有人问我在Python 3编写一个函数为:写一个调用的函数general_poly
,这将,例如,评估general_poly([1, 2, 3, 4])(10)
对1234
因1*10^3 + 2*10^2 + 3*10^1 + 4*10^0
.
现在我不明白第二个括号是什么(10)
意思.
我的功能如何general_poly
知道,将这个值放在自身内部并使用它?
这两个片段来自 Python,在行为上几乎完全等同。它们都工作并提供相同的输出,尽管它们生成的字节码略有不同。
def lower_case(s):
return s.lower()
map(lower_case, ["A", "B"])
Run Code Online (Sandbox Code Playgroud)
与
def lower_case(s):
return s.lower()
map(lambda s: lower_case(s), ["A", "B"])
Run Code Online (Sandbox Code Playgroud)
学习 Rust,我正在尝试解决以下案例。有一个函数接收字符串并返回第一个字符大写的字符串版本:
pub fn capitalize_first(input: &str) -> String {
let mut c = input.chars();
match c.next() {
None => String::new(),
Some(first) => first.to_uppercase().collect::<String>() + c.as_str(),
}
}
Run Code Online (Sandbox Code Playgroud)
用另一个接受字符串向量的函数包装这个函数是有趣的地方:
pub fn capitalize_first(input: &str) -> String {
let mut c = input.chars();
match c.next() {
None => String::new(),
Some(first) => first.to_uppercase().collect::<String>() + c.as_str(),
}
}
pub fn capitalize_words(words: Vec<&str>) -> Vec<String> {
words.iter().map(|w| …
Run Code Online (Sandbox Code Playgroud)