2014-10-07 7 views
5

Próbuję użyć pakietu python click, aby przekazać argument wiersza poleceń do funkcji. Przykład z oficjalnej dokumentacji działa tak, jak wyjaśniono. Ale nigdzie w dokumentacji nie wspomniano, jak zwrócić wartość z powrotem. Żadna z funkcji w dokumentacji nie zwraca wartości, więc nie rozumiem, jak to zrobić.Jak zwrócić wartość, gdy @ click.option jest używane do przekazania argumentu wiersza poleceń do funkcji?

Biorąc przykład w dokumentacji:

import click 

@click.command() 
@click.option('--count', default=3, help='Number of greetings.') 

def hello(count): 
    """Simple program that greets NAME for a total of COUNT times.""" 
    for x in range(count): 
     click.echo('Hello') 

if __name__ == '__main__': 
    hello() 

Co chcę zrobić:

import click 

@click.command() 
@click.option('--count', default=3, help='Number of greetings.') 

def hello(count): 
    """Simple program that greets NAME for a total of COUNT times.""" 
    for x in range(count): 
     click.echo('Hello') 
    return "hello hi" 

if __name__ == '__main__': 
    print(hello()) 

"cześć cześć" nie jest zwracana jako wyjście na konsoli. Czy ktoś może mi powiedzieć, jak to osiągnąć?

Odpowiedz

-3

Najwyraźniej ten pakiet click sprawia, że ​​twoja funkcja hello() nigdy nie wraca. Tak więc druk nigdy się nie dzieje. Gdybym był tobą, nie użyłbym tego nieintuicyjnego pakietu i zamiast niego użyłbym argparse, który jest świetny w przetwarzaniu linii poleceń w Pythonie (jeden z najlepszych w jakimkolwiek języku, moim zdaniem).

Oto działająca wersja Twojego kodu z użyciem argparse. Działa on natychmiast po uruchomieniu w Pythonie (dowolna wersja 2.7 lub nowsza) i jest łatwy do zrozumienia.

def hello(count): 
    """Simple program that greets NAME for a total of COUNT times.""" 
    for x in range(count): 
     print('Hello') 
    return "hello hi" 

if __name__ == '__main__': 
    import argparse 
    parser = argparse.ArgumentParser(description=__doc__) 
    parser.add_argument('--count', default=3, type=int, help='Number of greetings.') 
    args = parser.parse_args() 

    print(hello(args.count)) 
+1

'argparse' skały, ale' click' dodaje wiele funkcjonalności na górze to, że w wielu sprawy przyniosłyby więcej kodu niż twoja rzeczywista logika. Zobacz [Dlaczego kliknij?] (Http://click.pocoo.org/3/why/) w dokumentach. Rozsądnie jest używać go zgodnie z jego przeznaczeniem. – abarnert

+0

@abarnert: W mojej odpowiedzi zredagowałem działającą wersję 'argparse'. Zajmuje jedną dodatkową linię kodu w porównaniu do oryginału z "kliknięciem". –

+3

Po przeczytaniu linku, który ci dałem, punkt "kliknięcia" nie jest przeznaczony dla prostych programów, ale dla takich rzeczy jak komponowanie skomplikowanych programów CLI. Powiedzenie "zapisuje tylko jedną linię dla tego programu" jest jak powiedzenie "C jest tak samo dobre jak Python, ponieważ jest tylko o 1 linię dłuższe dla Hello, World". – abarnert

4

Niestety, to, co próbujesz zrobić, nie ma sensu. Programy wiersza polecenia mogą mieć kod wyjścia , ale to tylko mała liczba całkowita; nie mogą zwracać tekstu lub dowolnych obiektów w Pythonie.

Istnieje quasi-standard dla tych liczb całkowitych; prosta wersja to 0 dla sukcesu, 1 dla większości błędów, 2 dla nieprawidłowych argumentów wiersza poleceń. click stara się, aby twoja funkcja stała się dobrym obywatelem linii poleceń, więc kiedy zamkniesz swoją funkcję, zadzwoni pod numer sys.exit (0 jeśli masz return, 1 jeśli jesteś raise, a 2 jeśli nie przetworzysz argumentów) .

Tak więc, niezależnie od tego, jaki jest return, nie ma żadnego efektu, a cokolwiek spróbujesz zrobić z wartością zwracaną na najwyższym poziomie, nawet się nie uruchamia.

Programy, które zwykle robią, gdy muszą "zwrócić" tekst, to wydrukować go na standardowe wyjście, do czego służy właśnie click.echo.

+1

dlaczego chciałbym drukować na konsoli, gdy chcę, aby funkcja przetwarzała coś i zwracała wartość? nie ma dla mnie sensu. Więc jeśli używam kliknięcia funkcji, nie mogę zwrócić wartości do funkcji wywołania? – simminni

+1

@imminni: Kiedy używasz '@ click.command', to, co już masz, nie jest już funkcją, jest to program linii poleceń. Nie ma do kogo wracać. To jest cały cel "@ click.command". Jeśli chcesz, aby funkcja zwracała wartość do wywołującego, po prostu nie rób tego jako 'command'. – abarnert

+1

@imminni: Powodem, dla którego chcesz drukować na konsoli jest to, że tworzysz narzędzie wiersza poleceń. W ten sposób narzędzia wiersza poleceń współdziałają ze sobą nawzajem: przez wyprowadzenie wyjścia jednego z nich na wejście następnego. Jeśli nie chcesz tego robić, dlaczego budujesz narzędzia z linii poleceń? – abarnert

0

Musisz kliknąć, aby wydrukować na standardowe wyjście za pomocą click.echo(). Oto przykład pracy przy użyciu kodu w swoim pytaniu (nie dbając o kodzie wyjścia jak wspominają inni):

import click 


@click.command() 
@click.option('--count', default=3, help='Number of greetings.') 
def hello(count): 
    """Simple program that greets NAME for a total of COUNT times.""" 
    for x in range(count): 
     click.echo('Hello') 
    return click.echo("hello hi") 

if __name__ == '__main__': 
    hello() 
Powiązane problemy