2015-12-14 6 views
5
def test_stats(team, *args): 

    if not args: 
      [do some stuff] 
    else: 

     team_fixtures = (Fixtures.objects.filter(home_team=team_details.id) | Fixtures.objects.filter(away_team=team_details.id))/ 
.filter(fixture_datetime__lt=datetime.now()).filter(fixture_datetime__year=args[0]) 

और संदर्भ के लिए है - आर्ग है:अजगर आर्ग काम नहीं कर रहा, जब तक कि यह एक ऐसी स्थिति संदर्भ

date_year = datetime.now().year 
इस प्रश्न के लिए

मैं

.filter(fixture_datetime__year=args[0]) 

क्योंकि जैसा कि आर्ग को संदर्भित करने की जरूरत है काम करने के लिए अगर मैं

.filter(fixture_datetime__year=args) 

मुझे त्रुटि मिलती है:

int() argument must be a string, a bytes-like object or a number, not 'tuple'

मैं समझता हूँ कि यह मानना ​​है कि यह एक टपल है, भले ही यह केवल एक मान है, लेकिन टर्मिनल

type(date_year) 

में निम्नलिखित मैं कक्षा वापस पाने के लिए जब मैं करता हूँ।

मुझे यहां केवल एक मान लौटने की स्थिति क्यों दिखानी है?

+1

'* args' * हमेशा * एक tuple है। –

+0

मुझे समझ में नहीं आता कि आप क्या पूछ रहे हैं। आप पहले से ही अपने प्रश्न में सब कुछ जवाब देने लगते हैं। यदि आप 'foo (* args) 'के लिए बिल्कुल एक तर्क' बार 'प्रदान करते हैं तो' args == (bar,) '। लेकिन अपनी पोस्ट पढ़ना आप पहले से ही जानते थे। – timgeb

+1

@timegb ओपी पूछ रहा है कि क्यों वह फ़ंक्शन कॉल में 'date_year' पास करता है, क्यों इसे पूर्णांक की बजाय लंबाई 1 के टुपल के रूप में पारित किया जाता है। –

उत्तर

4

* -prefixed तर्क हमेशा एक टुपल है। यह 0 या अधिक अतिरिक्त स्थितित्मक तर्कों को कैप्चर करता है। आप 3 या 20 या 100 अतिरिक्त तर्कों (स्पष्ट team तर्क से परे) के साथ अपने test_stats() समारोह कॉल कर सकते हैं, और वे सभी समारोह में args टपल का हिस्सा होगा:

>>> def foo(*args): return args 
... 
>>> foo() 
() 
>>> foo(42) 
(42,) 
>>> foo(1, 2, 3) 
(1, 2, 3) 

यदि आप एक वैकल्पिक चाहता था

def test_stats(team, optional=None): 
    if optional is None: 
     # ... 
    else: 
     team_fixtures = (
      Fixtures.objects.filter(home_team=team_details.id) | 
      Fixtures.objects.filter(away_team=team_details.id)) 
       .filter(fixture_datetime__lt=datetime.now()) 
       .filter(fixture_datetime__year=optional) 
     ) 
+0

अभी भी यह पता लगाने लायक हो सकता है कि 'foo (1) '' (1,) 'वापस आएगा। यदि कोई भी एक तर्क सोचता है तो एक अपवाद है। – SuperBiasedMan

+1

@SuperBiasedMan: किया गया, मेरे पसंदीदा पूर्णांक का उपयोग कर किया। –

1

आप जानते हैं कि आप एक दूसरे तर्क के रूप में की तारीख प्राप्त कर रहे हैं तो स्पष्ट रूप से हस्ताक्षर

में परिभाषित: तर्क, यह एक प्रहरी डिफ़ॉल्ट के साथ एक कीवर्ड तर्क, None की तरह बनाने के
def test_stats(team, date): 

तुम वहाँ पारित कर सकते हैं, तो भी कुछ अलग तो एक दृश्य पहले से

def get_integers(*args): 
    return args 


>>> get_integers(1, 3, 4, 8, 9, 11) 
(1, 3, 4, 8, 9, 11) 

बनाये बिना खोजशब्द तर्क

def test_stats(team, date=None, something_else=None): 

*args केवल इस्तेमाल किया जाना चाहिए उपयोग करें यदि आप बहस के अनुक्रम पास करना चाहते हैं *args एक टुपल है और **kwargs एक शब्दकोश है।

संबंधित मुद्दे