Skip to content

parse_args in completers not populated when Action is used. #548

@RiccySidoli

Description

@RiccySidoli

When defining a custom Completion and Action the parsed_args for Completer call are empty. This means I cannot use first completiion in second.

I am using macos 26.1 (Tahoe), Python 3.14.0, zsh (macOS)

Code:

#!/usr/bin/env python3

PYTHON_ARGCOMPLETE_OK

import os,sys
import argparse, argcomplete
from argcomplete.completers import FilesCompleter, ChoicesCompleter, BaseCompleter
from argcomplete import warn

class ArtistAction(argparse.Action):
""" Custom action to get artist id from artist name """
def call(self, parser, namespace, values, option_string=None):
""" Custom action to set arg to artist id based on artist name.
"""
warn(f"ArtistAction Entry: namespace={namespace}")
setattr(namespace, "test_artist", 10)
setattr(namespace,"artist", values)
warn(f"ArtistAction Exit: namespace={namespace}")

class AlbumAction(argparse.Action):
""" Custom action to get album id from album name """
def call(self, parser, namespace, values, option_string=None):
""" Custom action to set arg to album id based on album name.
"""
warn(f"AlbumAction Entry: namespace={namespace}")
setattr(namespace,"test_album", 10)
setattr(namespace,"album", values)
warn(f"AlbumAction Exit: namespace={namespace}")

class ArtistCompleter(BaseCompleter):
""" Completer for artist names """
def call(self, prefix, parser, parsed_args, **kwargs):
""" Complete artist names """
warn(f'ArtistCompleter: parsed_args={parsed_args}')
return ['Artist1', 'Artist2', 'Artist3']

class AlbumCompleter(BaseCompleter):
""" Completer for album names """
def call(self, prefix, parser, parsed_args, **kwargs):
""" Complete album names """
warn(f'AlbumCompleter: parsed_args={parsed_args}')
return ['Album1', 'Album2', 'Album3']

def get_args():

warn("Creating argument parser")
parser = argparse.ArgumentParser(description='Search for an artist on Spotify',formatter_class=argparse.ArgumentDefaultsHelpFormatter)

warn("Adding arguments")

# parser.add_argument('artist',  help='An Artist').completer=ArtistCompleter()
# parser.add_argument('album',  help='An Album').completer=AlbumCompleter()
# parser.add_argument('artist', action=ArtistAction, help='An Artist')
# parser.add_argument('album', action=AlbumAction, help='An Album')
parser.add_argument('artist', action=ArtistAction, help='An Artist').completer=ArtistCompleter()
parser.add_argument('album', action=AlbumAction, help='An Album').completer=AlbumCompleter()

#argcomplete.autocomplete(parser, always_complete_options=False)
warn("Calling argcomplete.autocomplete")

a = argparse.Namespace()
setattr(a, "check", 1)

argcomplete.autocomplete(parser)

#setattr(parser, 'sp', sp)    # Add Spotify object to parser for access in actions
return parser.parse_args(namespace=a)

def test_search_artist():

args = get_args()

print(args)

def main():
test_search_artist()

if name == "main":
main()

results in:

ArtistCompleter: parsed_args=Namespace(artist=None, album=None)
test_completions.py
ArtistCompleter: parsed_args=Namespace(artist=None, album=None)
--help -h --test_completions.py Artist3
AlbumCompleter: parsed_args=Namespace(artist=None, album=None)
test_completions.py Artist3
AlbumCompleter: parsed_args=Namespace(artist=None, album=None)
--help -h -- shtest_completions.py Artist3 Album2

Creating argument parser

Adding arguments

Calling argcomplete.autocomplete

ArtistAction Entry: namespace=Namespace(check=1, artist=None, album=None)

ArtistAction Exit: namespace=Namespace(check=1, artist='Artist3', album=None, test_artist=10)

AlbumAction Entry: namespace=Namespace(check=1, artist='Artist3', album=None, test_artist=10)

AlbumAction Exit: namespace=Namespace(check=1, artist='Artist3', album='Album2', test_artist=10, test_album=10)
Namespace(check=1, artist='Artist3', album='Album2', test_artist=10, test_album=10)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions