class_docstr: A `Composable` representing a placeholder for query parameters.
  
  If the name is specified, generate a named placeholder (e.g. ``%(name)s``),
  otherwise generate a positional placeholder (e.g. ``%s``).
  
  The object is useful to generate SQL queries with a variable number of
  arguments.
  
  Examples::
  
      >>> names = ['foo', 'bar', 'baz']
  
      >>> q1 = sql.SQL("insert into table ({}) values ({})").format(
      ...     sql.SQL(', ').join(map(sql.Identifier, names)),
      ...     sql.SQL(', ').join(sql.Placeholder() * len(names)))
      >>> print(q1.as_string(conn))
      insert into table ("foo", "bar", "baz") values (%s, %s, %s)
  
      >>> q2 = sql.SQL("insert into table ({}) values ({})").format(
      ...     sql.SQL(', ').join(map(sql.Identifier, names)),
      ...     sql.SQL(', ').join(map(sql.Placeholder, names)))
      >>> print(q2.as_string(conn))
      insert into table ("foo", "bar", "baz") values (%(foo)s, %(bar)s, %(baz)s)
code: def __init__(self, name=None):
      if isinstance(name, str):
          if ")" in name:
              raise ValueError(f"invalid name: {name!r}")
  
      elif name is not None:
          raise TypeError(
              f"expected string or None as name, got {name!r}"
          )
  
      super().__init__(name)
  
imports: import string
  from psycopg2 import extensions
label_desc: Use image node_id 1 to create a new Placeholder object from inherited base classes: Composable with example: obj = Placeholder(name)