你能创建一个用点“。”引用的值吗?蟒蛇

时间:2013-02-19 13:52:01

标签: python

我想调用一个以类作为参数的函数,而不传递类。

该函数仅使用类中的整数值,我调用它的位置具有可以独立计算值的信息。

我的代码如下:

我想打电话的功能:

    def buckets_from_pairs(fs_pairs,par):
        fsea=fermi_sea(par.N)

        # rest of function has no reference to par

我打来的功能:

    def deltas(roots):
        if "buckets" in roots:
            # do function on    roots["buckets"]

        if "partition" in roots:
            #somehow define     value  such that  value.N=len(roots["roots"])

            buckets=buckets_from_pairs(roots["partition"], value)

            #do function on    buckets

我可以更改deltaspar作为参数,我可以将buckets_from_pairs更改为不使用par,但两者都需要进行大量修改,我会我必须与我的主管一起组织这两个职能(他没有这个问题)。

所以我希望有一种更简单的方法来创建一个可以使用“点”引用某些东西的对象,而不是在调用函数中创建一个新类。

5 个答案:

答案 0 :(得分:4)

你可以制作这样的小适配器:

class Adapter(object):
    def __init__(self, n):
        self.N = n

然后:

buckets=buckets_from_pairs(roots["partition"], Adapter(len(roots["roots"]))

答案 1 :(得分:4)

from collections import namedtuple
value = namedtuple('Value', 'N')(len(roots["roots"]))

答案 2 :(得分:2)

为什么不

def buckets_from_pairs(fs_pairs, N):
    fsea=fermi_sea(N)

调用
buckets=buckets_from_pairs(roots["partition"], value.N)

答案 3 :(得分:1)

@gnibbler答案很好,@ John Zwinck有个好主意,但它可以变得一般:

class objval(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

par = objval(N=len(roots["roots"])

通常,objval允许您动态创建包含在对象中的值,如:

o = objval(prop1=value1, prop2=value2)

您选择的解决方案归结为品味。

答案 4 :(得分:1)

如果值应该是可修改的;你可以在Python 3.3 +中使用types.SimpleNamespace类:

from types import SimpleNamespace

value = SimpleNamespace(N=len(roots["roots"]))

在较旧的Python版本上,您可以使用Adapter class

对于只读案例;你可以使用namedtuple