code: def __iter__(self):
      can_acquire = self._access_lock.acquire(blocking=False)
      if not can_acquire:
          raise Exception("Concurrent iteration not supported")
      self.file.seek(0)
      try:
          reader = csv.DictReader(
              (line.replace("\0", "") for line in self.file),
              fieldnames=self.field_names,
              delimiter=self.delimiter,
              quoting=csv.QUOTE_MINIMAL
              if self.quoted
              else csv.QUOTE_NONE,
          )
          if self.drop_incomplete_rows:
              for row in reader:
                  self.total_rows_count += 1
                  if any(
                      map(lambda v: v is None, row.values())
                  ):  # drop!
                      self.incomplete_rows_count += 1
                      continue
                  yield row
          else:
              yield from reader
      finally:
          self._access_lock.release()
  
imports: import csv
  import logging
  import sys
  import threading
  from typing import Dict, List, Optional, Type
  from pytext.utils.path import get_absolute_path
  from .data_source import generator_property, RootDataSource, SafeFileWrapper, ShardedDataSource
  from .session import SessionDataSource
label_desc: Use image node_id 2 for calling the TSV obj's underlying member method code with example usage: obj.__iter__() without return types