2010-11-22 13 views
1

Argparse kullanarak özyinelemeli bir program yazıyorum. Tek gerekli argüman, harekete geçecek bir dosya (veya dosya). Yinelemeli olarak adlandırdığımda, dosya isimlerine ihtiyacım yok (yeni bir dizinde arama yapacağım gibi), fakat seçeneklere ihtiyacım var. Sorun, argparse'nin hem python programname.py -options arg FILENAME FILENAME hem de python programname.py FILENAME FILENAME -options arg'a izin vermesidir. Dikkatli bir şekilde bir '-' için arama yapabilirim ve bir tonluk bir ifadeyle çalışabilirim, ama daha iyi bir yol olmalı diye düşünüyorum.özyineleme

parser = argparse.ArgumentParser(description='Personal upload script. (defaults to ' + user + '@' + server + directory + ')') 
parser.add_argument('files', nargs="+", help='file(s) to upload') 
parser.add_argument('-s', metavar='example.com', default=server, help='server to upload to') 
parser.add_argument('-u', metavar='username', default=user, help='ftp username') 
parser.add_argument('-p', metavar='password', default=password, help='ftp password') 
parser.add_argument('-d', metavar='example/', default=directory, help='directory to place file in') 
parser.add_argument('-n', metavar='myfile.txt', help='name to save file as') 
parser.add_argument('-c', metavar='###', help='chmod upload') 
parser.add_argument('-l', action='store_true', help='print out new url(s)') 
parser.add_argument('-r', action='store_true', help='recursive') 
parser.add_argument('-F', action='store_true', help='force (overwrite files/create non-existing dirs)') 
parser.add_argument('-v', action='store_true', help='verbose') 
args = parser.parse_args() 

çok teşekkürler: Burada

Önemli olduğundan emin, ama benim argparse bildirimleri vardır!

cevap

7

Sadece hayatınızı zorlaştırıyorsunuz. Programları tekrarlı yapmazsanız, işlevlerini özyinelemeli yaparsınız. Bir programın tekrarlı hale getirilmesi, belleğin tükenmesi ve genellikle bir sistemin üstesinden gelmek için mükemmel bir yoldur.

Uygulamanızı, yinelemeli çalışmanın, uygulamanızın başka bir örneği yerine, kendisini çağıran bir işlevle sınırlı olacak şekilde yeniden yazın. Veya daha iyisi, tamamen tekrarlılığı ortadan kaldırın. Görünüşe göre bir dizin ağacından geçiyorsun. Bunu yinelemek için hiçbir sebep yok. Aslında, Python sizin için birbir dizin ağacı yürüyen ilgilenecek bir kütüphane fonksiyonu vardır. Bakınız os.walk.

1

Muhtemelen işlem düzeyinde özyineleme yapmamalısınız. Bu, argparse'ın "-" tedavisinin aradığınız aracı sağlayabileceğini (eğer doğru anladıysam) düşünüyorum. "-" dizesi için argparse dokümanı ara.