python - जब तक वे एक वैध प्रतिक्रिया नहीं देते हैं तब तक उपयोगकर्ता को इनपुट के लिए पूछना




validation loops python-3.x user-input (10)

मैं एक प्रोग्राम लिख रहा हूं जिसे उपयोगकर्ता से इनपुट स्वीकार करना होगा।

#note: Python 2.7 users should use `raw_input`, the equivalent of 3.X's `input`
age = int(input("Please enter your age: "))
if age >= 18: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

यह अपेक्षाकृत काम करता है अगर उपयोगकर्ता समझदार डेटा में प्रवेश करता है।

C:\Python\Projects> canyouvote.py
Please enter your age: 23
You are able to vote in the United States!

लेकिन अगर वे गलती करते हैं, तो यह दुर्घटनाग्रस्त हो जाता है:

C:\Python\Projects> canyouvote.py
Please enter your age: dickety six
Traceback (most recent call last):
  File "canyouvote.py", line 1, in <module>
    age = int(input("Please enter your age: "))
ValueError: invalid literal for int() with base 10: 'dickety six'

क्रैश होने के बजाय, मैं इसे फिर से इनपुट प्राप्त करने का प्रयास करना चाहता हूं। इस कदर:

C:\Python\Projects> canyouvote.py
Please enter your age: dickety six
Sorry, I didn't understand that.
Please enter your age: 26
You are able to vote in the United States!

मैं यह कैसे हासिल कर सकता हूं? क्या होगा यदि मैं -1 जैसे मूल्यों को अस्वीकार करना चाहता हूं, जो एक वैध int , लेकिन इस संदर्भ में बकवास है?


Answers

आप उपयोगकर्ता को केवल विशिष्ट संख्या में प्रवेश करने की अनुमति देने के लिए अधिक सामान्य तर्क लिख सकते हैं, क्योंकि एक ही उपयोग-केस कई वास्तविक-दुनिया अनुप्रयोगों में उत्पन्न होता है।

def getValidInt(iMaxAttemps = None):
  iCount = 0
  while True:
    # exit when maximum attempt limit has expired
    if iCount != None and iCount > iMaxAttemps:
       return 0     # return as default value

    i = raw_input("Enter no")
    try:
       i = int(i)
    except ValueError as e:
       print "Enter valid int value"
    else:
       break

    return i

age = getValidInt()
# do whatever you want to do.

जबकि try / ब्लॉक को except काम करेगा, इस कार्य को पूरा करने के लिए एक तेज़ और साफ तरीका str.isdigit() का उपयोग करना होगा।

while True:
    age = input("Please enter your age: ")
    if age.isdigit():
        age = int(age)
        break
    else:
        print("Invalid number '{age}'. Try again.".format(age=age))

if age >= 18: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

हालांकि स्वीकृत उत्तर अद्भुत है। मैं इस समस्या के लिए एक त्वरित हैक साझा करना भी चाहूंगा। (यह ऋणात्मक आयु की समस्या का भी ख्याल रखता है।)

f=lambda age: (age.isdigit() and ((int(age)>=18  and "Can vote" ) or "Cannot vote")) or \
f(raw_input("invalid input. Try again\nPlease enter your age: "))
print f(raw_input("Please enter your age: "))

पीएस यह कोड पायथन 2.x के लिए है और raw_input और प्रिंट फ़ंक्शंस को बदलकर 3.x पर निर्यात किया जा सकता है।


आप इनपुट लूप को थोड़ी देर के लिए लूप लूप बना सकते हैं, इसलिए यह बार-बार उपयोगकर्ताओं के इनपुट के लिए पूछता है और फिर उस लूप को तोड़ देता है यदि उपयोगकर्ता आपकी इच्छित प्रतिक्रिया में प्रवेश करता है। और आप अमान्य प्रतिक्रियाओं को संभालने के लिए ब्लॉक को छोड़कर और ब्लॉक को छोड़कर उपयोग कर सकते हैं।

while True:

    var = True

    try:
        age = int(input("Please enter your age: "))

    except ValueError:
        print("Invalid input.")
        var = False

    if var == True:
        if age >= 18:
                print("You are able to vote in the United States.")
                break
        else:
            print("You are not able to vote in the United States.")

Var वैरिएबल बस इतना है कि यदि उपयोगकर्ता पूर्णांक की बजाय स्ट्रिंग में प्रवेश करता है तो प्रोग्राम वापस नहीं आएगा "आप संयुक्त राज्य में मतदान करने में सक्षम नहीं हैं।"


आप while True क्यों करेंगे और फिर इस लूप से बाहर निकलेंगे, जबकि आप अपनी आवश्यकताओं को केवल वक्तव्य में डाल सकते हैं क्योंकि आप चाहते हैं कि उम्र बढ़ने के बाद ही आप रुक जाएं?

age = None
while age is None:
    input_value = input("Please enter your age: ")
    try:
        # try and convert the string input to a number
        age = int(input_value)
    except ValueError:
        # tell the user off
        print("{input} is not a number, please enter a number only".format(input=input_value))
if age >= 18:
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

इसके परिणामस्वरूप निम्नलिखित होंगे:

Please enter your age: *potato*
potato is not a number, please enter a number only
Please enter your age: *5*
You are not able to vote in the United States.

यह काम करेगा क्योंकि उम्र के पास कभी ऐसा मूल्य नहीं होगा जो समझ में नहीं आएगा और कोड आपके "व्यावसायिक प्रक्रिया" के तर्क का पालन करेगा।


इसे पूरा करने का सबसे आसान तरीका input विधि को थोड़ी देर लूप में रखना होगा। जब आप खराब इनपुट प्राप्त करते हैं तब continue , और जब आप संतुष्ट हों तो लूप से बाहर निकलें।

जब आपका इनपुट एक अपवाद उठा सकता है

जब उपयोगकर्ता उस डेटा में प्रवेश करता है जिसे पार्स नहीं किया जा सकता है, तो यह पता लगाने के लिए प्रयास करें और पकड़ें।

while True:
    try:
        # Note: Python 2.x users should use raw_input, the equivalent of 3.x's input
        age = int(input("Please enter your age: "))
    except ValueError:
        print("Sorry, I didn't understand that.")
        #better try again... Return to the start of the loop
        continue
    else:
        #age was successfully parsed!
        #we're ready to exit the loop.
        break
if age >= 18: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

अपने स्वयं के सत्यापन नियमों को लागू करना

यदि आप उन मानों को अस्वीकार करना चाहते हैं जो पायथन सफलतापूर्वक पार्स कर सकते हैं, तो आप अपना स्वयं का सत्यापन तर्क जोड़ सकते हैं।

while True:
    data = input("Please enter a loud message (must be all caps): ")
    if not data.isupper():
        print("Sorry, your response was not loud enough.")
        continue
    else:
        #we're happy with the value given.
        #we're ready to exit the loop.
        break

while True:
    data = input("Pick an answer from A to D:")
    if data.lower() not in ('a', 'b', 'c', 'd'):
        print("Not an appropriate choice.")
    else:
        break

अपवाद हैंडलिंग और कस्टम सत्यापन का संयोजन

उपरोक्त दोनों तकनीकों को एक लूप में जोड़ा जा सकता है।

while True:
    try:
        age = int(input("Please enter your age: "))
    except ValueError:
        print("Sorry, I didn't understand that.")
        continue

    if age < 0:
        print("Sorry, your response must not be negative.")
        continue
    else:
        #age was successfully parsed, and we're happy with its value.
        #we're ready to exit the loop.
        break
if age >= 18: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

एक समारोह में यह सब encapsulating

यदि आपको अपने उपयोगकर्ता से कई अलग-अलग मूल्यों के लिए पूछना है, तो यह कोड किसी फ़ंक्शन में रखना उपयोगी हो सकता है, इसलिए आपको हर बार इसे फिर से टाइप करने की आवश्यकता नहीं है।

def get_non_negative_int(prompt):
    while True:
        try:
            value = int(input(prompt))
        except ValueError:
            print("Sorry, I didn't understand that.")
            continue

        if value < 0:
            print("Sorry, your response must not be negative.")
            continue
        else:
            break
    return value

age = get_non_negative_int("Please enter your age: ")
kids = get_non_negative_int("Please enter the number of children you have: ")
salary = get_non_negative_int("Please enter your yearly earnings, in dollars: ")

यह सब एक साथ डालें

आप बहुत ही सामान्य इनपुट फ़ंक्शन बनाने के लिए इस विचार को बढ़ा सकते हैं:

def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
    if min_ is not None and max_ is not None and max_ < min_:
        raise ValueError("min_ must be less than or equal to max_.")
    while True:
        ui = input(prompt)
        if type_ is not None:
            try:
                ui = type_(ui)
            except ValueError:
                print("Input type must be {0}.".format(type_.__name__))
                continue
        if max_ is not None and ui > max_:
            print("Input must be less than or equal to {0}.".format(max_))
        elif min_ is not None and ui < min_:
            print("Input must be greater than or equal to {0}.".format(min_))
        elif range_ is not None and ui not in range_:
            if isinstance(range_, range):
                template = "Input must be between {0.start} and {0.stop}."
                print(template.format(range_))
            else:
                template = "Input must be {0}."
                if len(range_) == 1:
                    print(template.format(*range_))
                else:
                    print(template.format(" or ".join((", ".join(map(str,
                                                                     range_[:-1])),
                                                       str(range_[-1])))))
        else:
            return ui

उपयोग के साथ जैसे:

age = sanitised_input("Enter your age: ", int, 1, 101)
answer = sanitised_input("Enter your answer: ", str.lower, range_=('a', 'b', 'c', 'd'))

आम समस्याएं, और आपको उनसे क्यों बचना चाहिए

अनावश्यक input वक्तव्य का अनावश्यक उपयोग

यह विधि काम करती है लेकिन आम तौर पर खराब शैली माना जाता है:

data = input("Please enter a loud message (must be all caps): ")
while not data.isupper():
    print("Sorry, your response was not loud enough.")
    data = input("Please enter a loud message (must be all caps): ")

यह शुरुआत में आकर्षक लग सकता है क्योंकि यह while True विधि के मुकाबले कम है, लेकिन यह सॉफ़्टवेयर विकास के सिद्धांत को दोहराएं नहीं । इससे आपके सिस्टम में कीड़े की संभावना बढ़ जाती है। क्या होगा यदि आप raw_input input बदलकर 2.7 पर बैकपोर्ट करना चाहते हैं, लेकिन गलती से केवल पहले input को बदल दें? यह एक SyntaxError बस होने का इंतजार कर रहा है।

रिकर्सन आपके ढेर को उड़ा देगा

यदि आपने रिकर्सन के बारे में अभी सीखा है, तो आप इसे get_non_negative_int में उपयोग करने के लिए लुभाने के लिए get_non_negative_int हो सकते हैं ताकि आप थोड़ी देर के लूप का निपटान कर सकें।

def get_non_negative_int(prompt):
    try:
        value = int(input(prompt))
    except ValueError:
        print("Sorry, I didn't understand that.")
        return get_non_negative_int(prompt)

    if value < 0:
        print("Sorry, your response must not be negative.")
        return get_non_negative_int(prompt)
    else:
        return value

ऐसा लगता है कि ज्यादातर समय ठीक काम करता है, लेकिन यदि उपयोगकर्ता पर्याप्त समय में अमान्य डेटा में प्रवेश करता है, तो स्क्रिप्ट एक RuntimeError: maximum recursion depth exceeded साथ समाप्त हो जाएगी RuntimeError: maximum recursion depth exceeded । आप सोच सकते हैं कि "कोई मूर्ख एक पंक्ति में 1000 गलतियों को नहीं करेगा", लेकिन आप मूर्खों की सरलता को कम करके समझ रहे हैं!


इसको आजमाओ:-

def takeInput(required):
  print 'ooo or OOO to exit'
  ans = raw_input('Enter: ')

  if not ans:
      print "You entered nothing...!"
      return takeInput(required) 

      ##  FOR Exit  ## 
  elif ans in ['ooo', 'OOO']:
    print "Closing instance."
    exit()

  else:
    if ans.isdigit():
      current = 'int'
    elif set('[[email protected]#$%^&*()_+{}":/\']+$').intersection(ans):
      current = 'other'
    elif isinstance(ans,basestring):
      current = 'str'        
    else:
      current = 'none'

  if required == current :
    return ans
  else:
    return takeInput(required)

## pass the value in which type you want [str/int/special character(as other )]
print "input: ", takeInput('str')

def validate_age(age):
    if age >=0 :
        return True
    return False

while True:
    try:
        age = int(raw_input("Please enter your age:"))
        if validate_age(age): break
    except ValueError:
        print "Error: Invalid age."

अपना कोड संपादित करने और त्रुटि को ठीक करने के लिए:

while True:
    try:
       age = int(input("Please enter your age: "))
       if age >= 18: 
           print("You are able to vote in the United States!")
           break
       else:
           print("You are not able to vote in the United States.")
           break
    except ValueError:
       print("Please enter a valid response")

सत्यापन को रीसेट करने के लिए हमें दो चीजें करना है:

  1. खेतों को साफ़ करें
  2. निम्नलिखित जोड़ें:

    $scope.programCreateFrm.$dirty = false;
    $scope.programCreateFrm.$pristine = true;
    $scope.programCreateFrm.$submitted = false;
    

programCreateFrm फॉर्म का नाम है। उदाहरण के लिए:

<form name="programCreateFrm" ng-submit="programCreateFrm.$valid && createProgram(programs)" novalidate>

यह कोड मेरे लिए काम कर रहा है।





python validation loops python-3.x user-input