komut satırı seçenekleri (argparse, Getopt, blargs, vs) ayrıştırma ve koordine etmek için birçok Python modülü vardır. Ve Python, çeşitli işlev argümanlarını (örneğin, varsayılan değerler, * varargs, ** keyword_args) işlemek için iyi yerleşik özellikler/deyimlerle kutsanmıştır. Ancak, üst düzey işlevler için çeşitli projelerin kodunu okurken, komut satırı argümanlarından çok daha az disiplin ve işlev argümanlarının standardizasyonunu görüyorum. Basit işlevler içinİşlev Argüman İşleme için Önerilen Python Modülleri?
, bu bir sorun değildir; yerleşik argüman özellikleri harika çalışır ve fazlasıyla yeterlidir. Ama onlar argüman karmaşıklığını yani üst düzey fonksiyonlar vb (tamamlayıcı veya münhasır bazı) farklı argümanlar ve seçenekler, farklı çalışma modları, aşırı sürmek varsayılan, bir sürü sağlar işlevsel zengin modüllerin .-- çok şey var orada komut satırı argümanlarına yaklaşıyor. Ve onlar büyük ölçüde kendi argümanlarını ad hoc yollarla hallediyor gibi görünüyor. komut satırı işleme sayısı göz önüne alındığında
orada modülleri ve bunlar zamanla kadar ne kadar rafine, Karmaşığım fonksiyon argümanları çekişme basitleştirilmesi için en az birkaç modülleri beklersiniz. Ancak PyPi, stackoverflow ve Google’ı başarı olmadan aradım. Öyleyse tavsiye edeceğiniz fonksiyonlar (komut satırı değil!) Argüman işleme modülleri var mı?--- örnekle güncelleme ---
Bu kullanım durumu size sofistike bir modül ile uğraşıyoruz kadar görünmez çünkü gerçekten basit somut örnek vermek zor. Ancak, koddaki problemi açıklamak için bir çekim: Biçimlendirici örneğinde geçersiz kılınabilen veya işlev/yöntem çağrıldığında varsayılan bir biçimlendirici modül. Sadece birkaç seçenek olan için, orada seçenek işleme şişirme çok şey zaten var ve seçenek adları bıktıracak tekrarlanır. API bunun size geçirildi seçenekleri işlemek için bazı modülü kullanmak daha kolay olacağını düşünüyorum kadar karmaşık olursa
defaults = { 'indent': 4,
'prefix': None,
'suffix': None,
'name': 'aFormatter',
'reverse': False,
'show_name': False
}
class Formatter(object):
def __init__(self, **kwargs):
self.name = kwargs.get('name', defaults['name'])
self.indent = kwargs.get('indent', defaults['indent'])
self.prefix = kwargs.get('prefix', defaults['prefix'])
self.suffix = kwargs.get('suffix', defaults['suffix'])
self.reverse = kwargs.get('reverse', defaults['reverse'])
self.show_name = kwargs.get('show_name', defaults['show_name'])
def show_lower(self, *args, **kwargs):
indent = kwargs.get('indent', self.indent) or 0
prefix = kwargs.get('prefix', self.prefix)
suffix = kwargs.get('suffix', self.suffix)
reverse = kwargs.get('reverse', self.reverse)
show_name = kwargs.get('show_name', self.show_name)
strings = []
if show_name:
strings.append(self.name + ": ")
if indent:
strings.append(" " * indent)
if prefix:
strings.append(prefix)
for a in args:
strings.append(a.upper() if reverse else a.lower())
if suffix:
strings.append(suffix)
print ''.join(strings)
if __name__ == '__main__':
fmt = Formatter()
fmt.show_lower("THIS IS GOOD")
fmt.show_lower("THIS", "IS", "GOOD")
fmt.show_lower('this IS good', reverse=True)
fmt.show_lower("something!", show_name=True)
upper = Formatter(reverse=True)
upper.show_lower("this is good!")
upper.show_lower("and so is this!", reverse=False)
def somefunc hakkında konuşuyorsunuz (requiredValue, optionalValue = None, * args, ** kwargs)?Eğer işleyişinizi bu şekilde kodlarsanız, tıpkı bir terminalden gelen komut satırı işlemlerini (bir fonksiyonun kendisi) ele alacağınız gibi. – platinummonkey
Karmaşık bir arabirime sahip bir işlev örneği ve bir kitaplıktan ne gibi basitleştirmeler beklediğinize dair bir fikir verebilir misiniz? (Değeri için, orada oldukça korkunç işlev arayüzleri olan bazı Python modülleri olduğunu düşünüyorum. Bunları kendiniz gibi yapmaya çalışmak yerine caydırıcı örnekler olarak düşünmenizi öneririm.) –
@SvenMarnach Gerçekten son derece dikkatli Orada tüm maliyetlerden kaçının! Ancak, bir fonksiyon (fabrika fonksiyonunu söyleyin), karmaşık bir kabiliyet için giriş noktasıysa, karmaşık olması mutlaka bir hata değildir. Sadece işin karmaşıklığını/değişkenliğini yansıtabilir. –