4.1.1 Implicit or Explicit attributes (keyword __init__argslen__)

The keyword __init__argslen__ must be an integer. It can be use, for instance, to force users to give all the attributes explicitely. See the following code:

# --
# Copyright (C) CEA, EDF
# Author : Erwan ADAM (CEA)
# --

import unittest

from xdata import *

class A(XObject):
    # 'x', 'y', 'z' can be given implicitely
    __init__xattributes__ = [
        XAttribute("x", xtype=XInt(min=0)),
        XAttribute("y", xtype=XInt(min=0)),
        XAttribute("z", xtype=XInt(min=0)),
        ]
    pass

class ATestCase(unittest.TestCase):
    def test(self):
        a = A(1, 2, 3)
        a = A(1, 2, z=3)
        a = A(z=3, y=2, x=1)
        return
    pass

class B(XObject):
    __init__argslen__ = 0 # Everything must be given explicitely
    __init__xattributes__ = [
        XAttribute("x", xtype=XInt(min=0)),
        XAttribute("y", xtype=XInt(min=0)),
        XAttribute("z", xtype=XInt(min=0)),
        ]
    pass

class BTestCase(unittest.TestCase):
    def test(self):
        b = B(x=1, y=2, z=3)
        b = B(z=3, y=2, x=1)
        self.failUnlessRaises(XAttributeError, B, 1, 2, 3)
        self.failUnlessRaises(XAttributeError, B, 1, y=2, z=3)
        return
    pass

class C(XObject):
    __init__argslen__ = 1 # Only 'x' can be given implicitely
    __init__xattributes__ = [
        XAttribute("x", xtype=XInt(min=0)),
        XAttribute("y", xtype=XInt(min=0)),
        XAttribute("z", xtype=XInt(min=0)),
        ]
    pass

class CTestCase(unittest.TestCase):
    def test(self):
        c = C(1, z=3, y=2)
        c = C(z=3, y=2, x=1)
        self.failUnlessRaises(XAttributeError, C, 1, 2, 3)
        self.failUnlessRaises(XAttributeError, C, 1, 2, z=3)
        return
    pass

if __name__ == '__main__':
    unittest.main()
    pass