我有一堆函数(在任何类之外),在其中设置了属性,例如funcname.fields = 'xxx'。我希望以后可以使用self.fields从函数内部访问这些变量,但是它当然告诉我:



所以...我该怎么办?我可以访问一些魔术变量吗?像__this__.fields吗?

几个人问“为什么?”。您可能会不同意我的推理,但我有一组函数必须全部共享相同的签名(仅接受一个参数)。在大多数情况下,此参数足以执行所需的计算。但是,在少数情况下,需要一些其他信息。我决定不强制每个函数接受一长串的大多数未使用的变量,而是决定将它们设置在函数上,以便可以轻松地忽略它们。

虽然,现在我想到,如果您不关心其他参数,则可以只将**kwargs用作最后一个参数。那好吧...

编辑:实际上,我没有编写某些函数,并且不希望对其进行修改以接受额外的args。通过将额外的args作为属性“传递”,我的代码既可以与利用额外args的自定义函数一起工作,也可以与不需要额外args的第三方代码一起工作。

感谢您的迅速答复:)

最佳答案

您不能在所有情况下都正确地执行“函数访问其自己的属性”的操作-请在how can python function access its own attributes?上查看详细信息-但这是一个快速演示:

>>> def f(): return f.x
...
>>> f.x = 7
>>> f()
7
>>> g = f
>>> g()
7
>>> del f
>>> g()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<interactive input>", line 1, in f
NameError: global name 'f' is not defined

基本上,大多数方法直接或间接地依赖于通过全局名称中的名称查找来访问功能对象。并且如果删除了原始函数名称,它将停止工作。还有其他一些笨拙的方法可以完成此任务,例如定义类或工厂-但由于您的解释,很显然您实际上并不需要此方法。

只需执行提到的关键字“全部捕获”参数即可,如下所示:
def fn1(oneArg):
    // do the due

def fn2(oneArg, **kw):
    if 'option1' in kw:
        print 'called with option1=', kw['option1']
    //do the rest

fn2(42)
fn2(42, option1='something')

不知道您在处理TypeError的评论中的意思-使用** kw时不会出现。这种方法对于某些python系统功能非常有效-检查min(),max(),sort()。最近sorted(dct,key=dct.get,reverse=True)在CodeGolf挑战中对我来说非常方便:)

关于python - "self"里面的普通功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3207572/

10-15 14:00