def __init__(self, func, checkA, checkB, error): props = requiredProperties(checkA) | requiredProperties(checkB) def check(context): ca = valueInContext(checkA, context) cb = valueInContext(checkB, context) if underlyingType(ca) is not underlyingType(cb): raise RuntimeParseError(error) return valueInContext(func(), context) super().__init__(props, check) self.inner = func self.checkA = checkA self.checkB = checkB
def __init__(self, arg, checkA, checkB, error): arg = toDelayedArgument(arg) assert requiredProperties(checkA) <= arg.requiredProperties assert requiredProperties(checkB) <= arg.requiredProperties def check(context): ca = valueInContext(checkA, context) cb = valueInContext(checkB, context) if underlyingType(ca) is not underlyingType(cb): raise RuntimeParseError(error) return arg.evaluateIn(context) super().__init__(requiredProperties(arg), check) self.inner = arg self.checkA = checkA self.checkB = checkB
def __init__(self, arg, types, error): def check(context): val = arg.evaluateIn(context) return coerceToAny(val, types, error) super().__init__(requiredProperties(arg), check) self.inner = arg self.types = types
def __init__(self, dependencies): deps = [] props = set() for dep in dependencies: if needsSampling(dep) or needsLazyEvaluation(dep): deps.append(dep) props.update(requiredProperties(dep)) super().__init__(props) self._dependencies = tuple(deps) # fixed order for reproducibility self._conditioned = self # version (partially) conditioned on requirements
def __init__(self, prop, value, deps=None, optionals={}): self.property = prop self.value = toDelayedArgument(value) if deps is None: deps = set() deps |= requiredProperties(value) if prop in deps: raise RuntimeParseError(f'specifier for property {prop} depends on itself') self.requiredProperties = deps self.optionals = optionals