Processing Batch Job Background
I have a script that either takes a text file that contains a list of player_ids or not. If the user provides a player_id list i ensure that all the ids are part of the tranche date they provided and then run the process job for all the player ids in the list.
If the user has not provided a list of players to run the jobs on we run the process job on all the players that are part of the tranche date.
Code
import argparse
from nba import release_checks, s3, shell
from typing import List
from nba.process_jobs_off_sqs import batch
from nba.process_jobs_off_sqs.exceptions import BatchTimeoutException


def _get_all_player_id(tranche_date: str) -&gt; List[str]:
    return s3.download_str_key(
        s3.S3Path(
            &quot;player-datasets&quot;,
            f&quot;ENVIRONMENTS/staging/{tranche_date}/all_player_ids_in_delivery.txt&quot;,
        )
    ).splitlines()


def _is_player_id_list_valid(
    provided_player_id_list: List[str], all_player_id_list: List[str]
) -&gt; bool:
    for player_id in provided_player_id_list:
        if player_id not in all_player_id_list:
            raise Exception(
                f&quot;The following player id: {player_id} in the text file is not part of the tranche you provided.&quot;
            )
    return True


def _launch_process_job(list_of_player_ids: List[str]) -&gt; None:
    jobs = [
        {&quot;player_id&quot;: player_id, &quot;job_id&quot;: player_id}
        for player_id in list_of_player_ids
    ]
    try:
        batch.launch_and_await_batch(&quot;automated_player_selection&quot;, jobs)
    except BatchTimeoutException:
        print(f&quot;Jobs are known to fail due data missingness.&quot;)


def _run_mentality_check(nba_folder_name: List[str]) -&gt; None:
    try:
        release_checks.mentality_check(
            nba_folder_name
        )
    except Exception as e:
        print(e)


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(&quot;--nba-folder-name&quot;, required=True)
    parser.add_argument(&quot;--tranche-date&quot;, required=True)
    parser.add_argument(&quot;--list-of-player-id-file-path&quot;)
    return parser.parse_args()


if __name__ == &quot;__main__&quot;:
    args = parse_args()
    all_player_id_list = _get_all_player_id(args.tranche_date)
    if args.list_of_player_id_file_path:
        provided_player_id_list = shell.lines_from_file(
            args.list_of_player_id_file_path
        )
        if _is_player_id_list_valid(provided_player_id_list, all_player_id_list):
            _launch_process_job(provided_player_id_list)
    else:
        _launch_process_job(provided_player_id_list)
    _run_mentality_check(args.nba_folder_name)

I am mostly looking for a code review for better python usage as i am new to python. I gave a vague background as i am less concerned on getting code review on the actual algorithm but more so about my code and how to make it more pythonic and clean.
Validation
This function _is_player_id_list_valid is stuck between two useful concepts - validating and returning bool, and throwing-or-not. Don't attempt to do a half-measure of both. Given its current name, it would be less surprising to do
for player_id in provided_player_id_list:
    if player_id not in all_player_id_list:
        return False
return True

If you want to keep the exception, then

Delete the return
Change the return type to None
Use a more specific type than Exception
Rename the method to something like check_player_id_list.

For this method you should also get rid of the loop, cast the lists to sets, use set intersection, and then base your error message off of all of the missing elements instead of just the first.
Late serialization
Validation should be done on tranche_date. The sanest way to do this is expect a date of a specific format (which you probably already do, though you haven't shown it); parse it into a real datetime (or perhaps date), and then re-serialize it in _get_all_player_id. Its representation should only be str at the extreme edges of your program - in your argument parsing, and in your S3 call. In the middle it should be a real date type.
Error messages
except BatchTimeoutException:
    print(f&quot;Jobs are known to fail due data missingness.&quot;)

is... a little strange. You could print this and it would still be valid even if there were no timeout. Instead perhaps consider
    print('Batch timed out. Data may be missing.')

Note that this does not need to be an f-string. Also, what data?