- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一组我经常使用的函数,所以我想将它们收集在一个库中。在开始编写库之前,我在考虑将影响某些函数行为的常量存储在何处。
在使用该库时我想写的是:
import tools
tools.collect(object_a, object_b, mode=tools.collect.RECURSIVE)
一般来说,函数应该能够接受的常量应该存储在函数本身中。
为了实现这一点,我创建了一个装饰函数,它将传递的属性分配给装饰函数。
def attr_decorator(**attrs):
def decorator(f):
for k, v in attrs.iteritems():
setattr(f, k, v)
return f
return decorator
这个装饰器可以这样使用:
@attr_decorator(
FLAT = 1 << 0,
RECURSIVE 1 << 1,
)
def collect(a, b, mode):
# ...
到目前为止,这工作得很好。
@attr_decorator(
FLAT = 1 << 0,
RECURSIVE 1 << 1,
)
def collect(a, b, mode=collect.RECURSIVE):
# ...
这不起作用,因为 collect 函数在存储 mode 参数的默认值时没有定义(因此甚至没有修饰)。
我能想出的唯一解决方案导致了一种笨拙的语法,而且看起来也不太好。我为装饰器函数提供了与要被装饰的函数相同的属性。
def attr_decorator(**attrs):
def decorator(f):
for k, v in attrs.iteritems():
setattr(f, k, v)
return f
for k, v in attrs.iteritems():
setattr(decorator, k, v)
return decorator
不用天才也能看出这本书读起来不好:
collect_d = attr_decorator(
FLAT = 1 << 0,
RECURSIVE = 1 << 1,
)
@collect_d
def collect(root, callback, mode=collect_d.RECURSIVE):
# ...
你能想到更好的方法吗?我真的很想坚持“一个声明来装饰”的事情。
最佳答案
您可以使用特殊变量作为对正在定义的函数的引用。
class Attr(object):
def __init__(self, name): self.name = name
class Attributor(object):
def __getattr__(self, x): return Attr(x)
_ = Attributor()
def attr_decorator(**attrs):
def decorator(f):
for k, v in attrs.iteritems():
setattr(f, k, v)
f.func_defaults = tuple(attrs[t.name] if isinstance(t, Attr) else t for t in f.func_defaults)
return f
return decorator
@attr_decorator(
FLAT = 1 << 0,
RECURSIVE = 1 << 1,
)
def collect(a, b, mode=_.RECURSIVE, foo=123):
print a, b, mode, foo
collect(100,200) # 100 200 2 123
关于python - 常量和糖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12554069/
对于NumericVector ,我可以将一个较小的 NumericVector 进行子集化通过使用 IntegerVector包含要子集化的位置。 例如假设x<-c(1,2,2,3,4,5) , i
我的 javascript 文件以配置开始... require.config({ baseUrl: 'scripts', paths: { 'code-mirror'
我的应用程序应该可以使用插件或通常称为糖的方式进行扩展。我会将它们放在 appname.app/Contents/sugars/sugarname.appnamesugar 下 这些是 bundle
我一直在尝试使用 Rcpp 在 C++ 中获取 vector 的等级。我使用了其他糖功能,例如 is_na(); C++中rank R函数有没有类似的糖函数。 Rcpp/ 中是否还有任何可用的 R 糖
我通过 Android Studio 使用 Sugar ORM 进行 Android 开发。 但我想我有一个非常相似的问题。如何将一个/多个结果查询显示为字符串或整数?我的实体看起来像这样: publ
入门读物: Prototypes as "classes" OO JS 按照上述模式,我创建如下库/API var Proto = { constructor: function () {
我在应用程序的第一个版本中使用了 SugarORM。现在,我正在开发第二个版本,它向数据库中添加了新表。 根据 SugarORM documentation “Sugar 会自动为新实体创建表,因此您
我是一名优秀的程序员,十分优秀!