【发布时间】:2013-09-10 21:28:13
【问题描述】:
我想为我的库提供用户 API,以更简单的方式区分我传递给函数的不同类型的参数。所有参数组都在前面定义(现在我有 3 个组),但它们的属性需要在运行时构建。我可以在 Django ORM 样式中执行此操作,其中双下划线分隔参数的 2 部分。但它非常不可读。示例:
def api_function(**kwargs):
""" Separate passed arguments """
api_function(post__arg1='foo', api__arg1='bar', post_arg2='foo2')
执行此 SQLAlchemy 的更好方法,但仅用于比较属性,并且所有 args 都已在前面定义。示例:
class API(object):
arg1 = Arg()
arg2 = Arg()
class Post(object): #...
def api_function(*args):
""" Separate passed arguments """
api_function(POST.arg1=='foo', API.arg1=='bar', POST.arg2=='foo2')
我想要实现的是这样的行为:
class API(object): # Magic
class POST(object): # Magic
def api_function(*args):
""" Separate passed arguments """
api_function(POST.arg1='foo', API.arg1='bar', POST.arg2='foo2')
我尝试了什么:
- 用定义的
__setattr__声明元模型,但它在评估SyntaxError: keyword can't be an expression时上升 - 声明
__set__,但它是为已知属性设计的
我的问题是:
- 在 Python 中是否可以像在第三个 sn-p 中一样工作?
- 如果没有,在第三个 sn-p 中是否有任何非常接近的解决方案?最好的方式应该使用赋值运算符
API.arg1='foo',最差的方式应该是API(arg1='foo')
要求——至少应该在 Python 2.7 上工作。很适合在 Python 3.2 上工作。
EDIT1 我的第一个测试是使用相等运算符(但 NEVER 应该以这种方式使用):
class APIMeta(type):
def __getattr__(cls, item):
return ApiData(item, None)
class API(object):
__metaclass__ = APIMeta
def __init__(self, key, value):
self.key = key
self.value = value
def __str__(self):
return "{0}={1}".format(self.key, self.value)
def __eq__(self, other):
self.value = other
return self
def print_api(*api_data):
for a in api_data:
print(str(a))
print_api(API.page=='3', API=='bar')
它工作正常,但使用== 表示我想比较一些东西并且我想分配值。
【问题讨论】:
-
api_function(POST=dict(arg1='foo', arg2='foo2'), API=dict(arg1='bar'))有什么问题? -
因为我也可以使用
api_function(POST(arg1='foo', arg2='foo2'), API(arg1='bar')),它更具可读性、更短和更合乎逻辑的解决方案。但我正在努力让这个图书馆更易于人们阅读。 -
@zwierzak 没有办法像第三个 sn-p 那样做到这一点。变量的名称中不能包含
.。但是,另一种方法绝对可行,具体取决于您期望如何访问api_function中的参数。 -
我不同意它更具可读性。如果我读到它,我将不确定发生了什么,我当然不会期望它只是传递一些命名字典的一种懒惰方式。
-
@zwierzak 在带有
=的python 分配中无法返回值。
标签: python python-2.7