通常我不会问这样的问题,但是Python似乎在惯用语方面有着非同寻常的社区共识,并且通过使它们更加高效来鼓励它们(例如列表推导式与map、filter相比)。
当我编码时,我发现自己经常使用以下JavaScript模式:
var f = (function() {
var closedOver = "whatever"
return function(param) {
// re-uses closure variable again and again with different param
}
})();
或者C:
int foo(int x)
{
/*
compile-time constant, will not be recalced for every call,
name 'someConst' not visible in other scopes
*/
const int someConst = 134;
/* do stuff */
return whatever;
}
一些可能的将其翻译成Python的方法:
globalConstant = someConstant
def foo(param):
# does stuff with param and constant
return whatever
或者可能是:
from functools import partial
def foo(invariant, variant):
"""Actually bar"""
# does stuff
return whatever
bar = partial(foo, someInvariant)
或者:
class Foo(object):
"""I'm just here to hold a non-visible binding. Actually bar"""
def __init__(self, invariant):
super(Foo, self).__init__()
self.value = invariant
def __call__(self, param):
return actualFnResultWithSelfValue
bar = Foo(invariant)
或者:
def foo(variant, invariant=someConstantValue):
return whatever
很不幸,现在我可能需要为初始函数定义使用临时名称,因为我只使用部分应用的版本,编写很多样板类(这些也有临时名称),或者在仅使用一个函数时污染模块命名空间与全局常量,或限制了我的函数参数,并确保某人可以通过以错误的参数调用它来破坏它。
我也可以通过在每次调用时重新实例化并希望它会被优化掉来“解决”这个问题,但由于我没有使用pypy,我对这方面不太乐观。
所以我的问题有两个方面:首先,是否有一种方法可以避免权衡?其次,如果没有,上述哪一种是最“pythonic”的(惯用语,性能,合理等)?
grep '^del ' Lib/
,以及对__all__
的赋值。 - Josh Lee*
进行导入,而这是不应该做的,如果需要,你可以通过__all__
来控制。无论如何,一种方法是将一次性项放在一个单独的模块中,throwaways
。然后只需导入该模块:您进行导入的顶级命名空间将仅感染一个新名称。 - FMc__all__
来控制导出直到 Josh Lee 在上面的评论中提到。至于一次性名称的问题,我的担忧主要与可读性有关,对我来说,用一个与调用它的名称不同的名称定义函数似乎很突兀。 - Jared Smithdef foo(a, x): return x ; foo = partial(foo, 'const')
,在装饰函数时很常见。 - Fruch