2014-10-07 13 views
5

Bir işleve bir komut satırı argümanı geçmesine click piton paketi kullanmak çalışıyorum. Resmi belgelere örnek olarak açıklandığı gibi çalışır. Ancak belgelerin hiçbir yerinde bir değeri nasıl geri döndüreceğinden bahsetmiyoruz. Belgedeki işlevlerin hiçbiri bir değer döndürmez, bu yüzden bunu nasıl yapacağımı anlamıyorum. belgelerineBir komut satırı argümanını bir işleve geçirmek için @ click.option kullanıldığında nasıl bir değer döndürürüm?

Verilen örnek:

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()) 

"merhaba hi" konsolda çıktı olarak iade edilmemesi: Yapmak istediğim ne

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() 

. Birisi bana bunun nasıl yapılacağını söyleyebilir mi?

cevap

-3

Görünüşe göre bu click paket hello() işlevi asla geri yapar. Yani baskı asla olmaz. Eğer ben olsaydım, bu bilinçsiz paketi kullanmazdım ve bunun yerine Python'da komut satırında mükemmel olan argparse'u kullanıyorum (bence her dilde en iyilerden biri).

İşte argparse kullanarak bir kod çalışma versiyonu. Python (herhangi bir sürüm 2.7 veya üstü) ile kutunun dışında çalışır ve anlaşılması kolaydır.

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' kayalar, ama' click' birçok o bunun üstüne işlevselliği bir sürü ekler: İşte (diğerleri de söylediğim gibi çıkış kodu hakkında önemsemeden) sorunuzu kodu kullanarak bir çalışma örneğidir vakalar gerçek mantığınızdan daha fazla kod alırdı. Dokümanlardaki [Neden Tıklanma?] (Http://click.pocoo.org/3/why/) adresine bakın. Amaçlanan amaç için kullanmak kesinlikle mantıklı. – abarnert

+0

@abarnert: Çalışmamın bir argparse sürümünü benim cevabım içine düzenledim. 'Click' ile orijinaline kıyasla bir kod satırı daha alır. –

+3

Size verdiğim bağlantıyı okursanız, 'click''in noktası, ölü-basit programlar için değildir, karmaşık CLI programları oluşturmak gibi şeyler içindir. "Bu program için sadece bir satır kaydeder" demek, "C, Python kadar iyi, çünkü Hello, World için sadece 1 satır daha uzun olduğu için" demek gibi. – abarnert

4

Maalesef, yapmaya çalıştığınız şey mantıklı değil. Komut satırı programları bir çıkış kodu olabilir, ancak bu yalnızca küçük bir tamsayıdır; metin veya rastgele Python nesneleri döndüremezler.

Orada bu tamsayılar ne anlama için bir yarı-standarttır; Basit sürüm başarı için 0, çoğu hata için 1, geçersiz komut satırı argümanları için 2'dir. click iyi komut satırı vatandaş içine işlevini yapmaya çalışıyor, böylece işlevini çıktığınızda, uygun sayı ile sys.exit çağrıları (0 eğer return, 1 raise ve 2 sizin argümanlar ayrıştırmak için başarısız olursa eğer) . Eğer return hatta koşmak almaz üst düzeyde dönüş değeri ile yapmaya çalışacağım hiçbir etkisi ve ne olursa olsun sahip olursa olsun Yani

.

hangi programlar ihtiyaç duydukları zaman genellikle yapmak için "dönüş" metin click.echo için tam olarak ne olduğu, standart çıkışa yazdırmak etmektir.

+1

Neden bir şeyi işlemek ve bir değer döndürmek için bir işlev istediğimde bir konsola yazdırmak isteyeyim? bana mantıklı gelmiyor. Yani bir işlevi tıklatırsam, çağıran bir işleve bir değer veremez miyim? – simminni

+1

@simminni: '@ click.com 'işlevini kullandığınızda, artık sahip olduğunuz işlev bir komut satırı programıdır. Dönecek kimse yok. Bu, @ click.command'ın tüm noktasıdır. Bir işleve bir değer döndürmek için bir işlev istiyorsanız, sadece bir 'komut' yapmayın. – abarnert

+1

@simminni: Ve bir konsola yazdırmak istediğiniz nedeni bir komut satırı aracı oluşturuyor olmanızdır. Bu, komut satırı araçlarının birbirleriyle nasıl etkileşim kurduklarıdır: Birinin çıktısını bir sonraki girişe yönlendirerek. Bunu yapmak istemiyorsan, neden en başta komut satırı araçları kuruyorsun? – abarnert

0

Sen) (click.echo kullanarak Stdout'a yazdırmak için tıklayın söylemeliyiz.

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() 
İlgili konular