# The comprehensions here shouldn't get collapsed to single lines.

GLOB_resources_legacy_txt = glob(["resources/legacy/*.txt"])

GLOB_resources_legacy_txt2 = [
  filename_and_some_extra_to_make_this_long
  for filename_and_some_extra_to_make_this_long in GLOB_resources_legacy_txt
]

legacy_txt_name_to_filename = {
  filename.split("/")[-1][:-len(".txt")].lower(): filename
  for filename in GLOB_resources_legacy_txt_tuple
}

flags = [flag
         for flag in [_flag(name, type(default), values.pop(name, default))
                      for name, default in defaults.items()]
         if flag != None]

flags = [flag  # Example comment.
         for flag in [_flag(name, type(default), values.pop(name, default))
                      for name, default in defaults.items()]  # Clarififcation.
         if flag != None]  # Skip empty elements.

flags = [
         # Example comment.
         flag
         # Clarififcation.
         for flag in [_flag(name, type(default), values.pop(name, default))
                      for name, default in defaults.items()]
         # Skip empty elements.
         if flag != None
        ]

flags = [


         # Example comment.

         flag


         # Clarififcation.
         for flag in [_flag(name, type(default), values.pop(name, default))
                      for name, default in defaults.items()]


         # Skip empty elements.

         if flag != None
        ]
