+ @staticmethod
+ def create(address, netlen = -1):
+ """Construct either a CidrV4 or CidrV6 object."""
+ if isinstance(address, int):
+ return CidrV4(address, netlen)
+ if isinstance(address, long):
+ if address <= pow(2, 32):
+ return CidrV4(address, netlen)
+ return CidrV6(address, netlen)
+ if ":" in address:
+ return CidrV6(address, netlen)
+ return CidrV4(address, netlen)
+
+
+ def _initialize(self, address, netlen):
+ """This a common constructor that is used by the subclasses."""
+
+ if isinstance(address, int) or \
+ isinstance(address, long) and netlen >= 0:
+ self.numaddr, self.netlen = address, netlen
+ self.addr = self._convert_ipaddr(address)
+ self.calc()
+ return
+
+ if not self.is_valid_cidr(address):
+ raise ValueError, \
+ repr(address) + " is not a valid CIDR representation"
+
+ if netlen < 0:
+ if type(address) == types.StringType:
+ if "/" in address:
+ self.addr, self.netlen = address.split("/", 1)
+ else:
+ self.addr, self.netlen = address, self._max_netlen()
+ elif type(address) == types.TupleType:
+ self.addr, self.netlen = address
+ else:
+ raise TypeError, "address must be a string or a tuple"
+ else:
+ self.addr, self.netlen = address, netlen
+
+
+ # convert string network lengths to integer
+ if type(self.netlen) == types.StringType:
+ self.netlen = int(self.netlen)
+
+ self.calc()
+