考虑以下python2代码
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
Run Code Online (Sandbox Code Playgroud)
这在python3中不受支持,我必须执行以下操作:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
Run Code Online (Sandbox Code Playgroud)
这非常难看.如果lambda是一个函数,我可以做
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
Run Code Online (Sandbox Code Playgroud)
在python3中删除此功能会强制代码执行丑陋的方式(使用魔术索引)或创建不必要的函数(最令人烦恼的部分是为这些不必要的函数考虑好名称)
我认为该功能至少应该添加到lambdas中.有没有好的选择?
更新:我正在使用以下助手扩展答案中的想法
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Run Code Online (Sandbox Code Playgroud)
Update2:更清洁版star
import functools
def star(f):
@functools.wraps(f):
def f_inner(args):
return f(*args)
return f_inner
Run Code Online (Sandbox Code Playgroud) 我想尝试做类似的事情:
from collections import defaultdict
import hashlib
def factory():
key = 'aaa'
return { 'key-md5' : hashlib.md5('%s' % (key)).hexdigest() }
a = defaultdict(factory)
print a['aaa']
Run Code Online (Sandbox Code Playgroud)
(实际上,我之所以需要访问工厂中的密钥,不是为了计算md5,而是出于其他原因;这只是一个例子)
正如你所看到的,在工厂里我无法访问密钥:我只是强迫它,这没有任何意义.
是否可以以defaultdict我可以在工厂中访问密钥的方式使用?
redis 版本 3.4.1 必须使用 hash,不能使用 str 或其他数据类型数据:
{'_anno': {
'ctp': 'list',
'dt': [],
'ml': 0,
'na': 'apple',
'pos': -1,
'rel': '',
'st_var': '',
'tp': 'object'},
'_att': {'_cuser': 'apple card',
'_last_editor': 'apple card',
'_protext': 'authorize',
'_status': 'normal',
'_theme_id': 'apple card',
'_view': '12'},
}
Run Code Online (Sandbox Code Playgroud)
我的代码
pool = redis.ConnectionPool(host=host, port=port)
conn = redis.StrictRedis(connection_pool=pool)
conn.hmset("aaaaaa",data)
Run Code Online (Sandbox Code Playgroud)
引发错误
数据错误:类型无效的输入:'dict'。首先转换为字节、字符串、整数或浮点数。
现在代码
pool = redis.ConnectionPool(host=host, port=port)
conn = redis.StrictRedis(connection_pool=pool)
new_data={}
for key,value in data.items():
new_data[key]=json.dumps(value)
conn.hmset("aaaaaa",new_data)
Run Code Online (Sandbox Code Playgroud)
有没有更pythonic的方式?