স্ক্রিপ্টটির জন্য কোনও ভেরিয়েবল পাস করা হয়েছে কিনা তা যাচাই করার সর্বোত্তম উপায় কী হবে:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
উত্তর:
শেষ পর্যন্ত, try, exceptপরীক্ষার মধ্যে পার্থক্যটি len(sys.argv)সমস্ত তাত্পর্যপূর্ণ নয়। তারা উভয় তুলনায় কিছুটা হ্যাকিশ argparse।
যদিও আমার কাছে এটি ঘটে - স্বল্প বাজেটের আরগপার্সের এক প্রকার হিসাবে:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
আপনি এমনকি এটির জন্য একটি namedtupleডিফল্ট মানগুলি তৈরি করতে এটি ব্যবহার করতে পারেন None- সমস্ত চার লাইনে!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
আপনি যদি তার সাথে পরিচিত না হন তবে namedtupleএটি কেবলমাত্র একটি টুপল যা কোনও বস্তুর মতো কাজ করে, আপনাকে tup.attributeসিনট্যাক্সের পরিবর্তে সিনট্যাক্স ব্যবহার করে এর মানগুলিতে অ্যাক্সেস করতে দেয় tup[0]।
সুতরাং প্রথম লাইনটি namedtupleপ্রতিটি মানের মান সহ একটি নতুন ধরণের তৈরি করে arg_names। দ্বিতীয় রেখাগুলি argsঅভিধান থেকে মানগুলি পাস করে , getযখন প্রদত্ত আর্গুমেন্টের নামের অভিধানের সাথে যুক্ত মান থাকে না তখন ডিফল্ট মান ফেরত দিতে ব্যবহার করে।
এর দৈর্ঘ্য পরীক্ষা করুন sys.argv:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
কিছু লোক আপনার প্রস্তাবিত ব্যতিক্রম-ভিত্তিক পদ্ধতির পছন্দ করে (যেমন, try: blah = sys.argv[1]; except IndexError: blah = 'blah'), তবে আমি এটি এতটা পছন্দ করি না কারণ এটি "স্কেল" প্রায় ভাল করে না (যেমন, আপনি যখন দু'তিনটি যুক্তি গ্রহণ করতে চান) এবং এটি সম্ভাব্য ত্রুটিগুলি আড়াল করতে পারে (উদাহরণস্বরূপ, আপনি যদি ব্যবহার করেন blah = foo(sys.argv[1])তবে foo(...)একটি উত্থাপন করেন IndexError, যা IndexErrorউপেক্ষা করা হবে)।
try, except। ক্লজ fooঅবধি আপনার যুক্তির জন্য অপেক্ষা করুন else।
argparse।
argparse.pyআমার সমস্ত কমান্ড-লাইন প্রকল্পে পেয়েছি ।
try... সুতরাং, এটি কোনও কঠিন (এবং, আইএমও, কিছুটা সুন্দর) না রেখে, আমি কেবল দৈর্ঘ্য পরীক্ষা করতে পছন্দ করি (এছাড়াও, আপনি লোকজন এড়াতে চান) প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রমগুলি ব্যবহার করার জন্য আপনাকে চিৎকার করবে)।
tryক্ষমা প্রার্থী, আমাকে অবশ্যই মানতে হবে। আমি কেবল অনুভব করি যে এটি কখনও কখনও ifবিবৃতি চেয়ে আমার স্পষ্টতাকে আরও স্পষ্টভাবে প্রকাশ করে।
আমি আর তালিকাভুক্ত এখনও দেখিনি যেটি হ'ল সময়ের আগে আপনার সেন্ডিনেল মান সেট করা। এই পদ্ধতিটি পাইথনের অলস মূল্যায়নের সুবিধা নেয়, যাতে আপনাকে সর্বদা elseবিবৃতি সরবরাহ করতে হবে না । উদাহরণ:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
অথবা আপনি যদি সিনট্যাক্স CRAZY এ যান তবে আপনি পাইথনের টেরিনারি অপারেটরটি ব্যবহার করতে পারেন :
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
আমি এটি ব্যবহার করি - এটি কখনই ব্যর্থ হয় না:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpointউদাহরণ থেকে পরিবর্তনশীল অপসারণ করতে পারি , তবে প্রশ্নটি একটি ফ্যালব্যাক ভেরিয়েবল বরাদ্দ করছে, তাই আমি কেবল এটি তৈরি করেছি।
sys.argv[1:]:। এটি অবস্থানগত আর্গুমেন্টগুলির সাথে কাজ করে যখন গণনা হয় না।
এটি একটি সাধারণ পাইথন তালিকা। আপনি যে ব্যতিক্রমটির জন্য এটি ধরবেন তা হ'ল ইনডেক্সেরর, তবে পরিবর্তে দৈর্ঘ্যটি পরীক্ষা করা আপনি ভাল।
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
বিল্ট-ইন ফন্টে ম্যাপের সাথে কাজ করা একটি সমাধান!
arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}
তারপরে আপনাকে কেবল আপনার পরামিতিগুলিকে কল করতে হবে:
if args['operation'] == "division":
if not args['parameter']:
...
if args['parameter'] == "euclidian":
...
আপনি কেবল argv [1] এর মানটি আরগভিতে সংযোজন করতে পারেন এবং তারপরে আরগভি [1] আপনার ইনপুট করা স্ট্রিংটির সমান হয় না কিনা তা পরীক্ষা করতে পারেন উদাহরণ:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])