code: def validate_exec_property_placeholder(
      key: str, placeholder: ph.Placeholder
  ):
      """Fails if the given placeholder is not allowed for an exec_property."""
      for p in placeholder.traverse():
          if isinstance(p, ph.ArtifactPlaceholder) and p.is_output:
              raise ValueError(
                  f"Exec property {key!r} depends on output placeholder {p.key!r} but "
                  "must not."
              )
          if isinstance(p, ph.ExecPropertyPlaceholder):
              raise ValueError(
                  f"Exec property {key!r} depends on another exec property "
                  f"{p.key!r} but must not."
              )
  
imports: from typing import cast, List, Optional, Sequence, Tuple, Type, Union, Dict, Any, Set
  from tfx import types
  from tfx.dsl.compiler import constants
  from tfx.dsl.components.base import base_node
  from tfx.dsl.components.common import importer
  from tfx.dsl.components.common import resolver
  from tfx.dsl.context_managers import dsl_context_registry
  from tfx.dsl.placeholder import placeholder
  from tfx.orchestration import data_types_utils
  from tfx.orchestration import pipeline
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.types import channel
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 20 for calling a global function with example usage: validate_exec_property_placeholder(key, placeholder) without return types