পাইথনে হাঁসের টাইপিং, ডেটা বৈধকরণ এবং দৃ programming় প্রোগ্রামিং


10

হাঁসের টাইপিং সম্পর্কে :

সঠিকভাবে ব্যবহার নিশ্চিত করার জন্য ডকুমেন্টেশন, ক্লিয়ার কোড এবং পরীক্ষার উপর নির্ভর করে পদ্ধতিতে এবং ফাংশন বডিগুলিতে আর্গুমেন্টের ধরণের জন্য পরীক্ষামূলকভাবে পরীক্ষা না করে হাঁসের টাইপিং সহায়তা করে।

যুক্তি বৈধতা সম্পর্কে (ইএএফপি: অনুমতি চেয়ে ক্ষমা চাইতে আরও সহজ)। এখান থেকে গৃহীত একটি উদাহরণ :

... এটি করা বেশি পাইথোনিক হিসাবে বিবেচিত:

def my_method(self, key):
    try:
        value = self.a_dict[member]
    except TypeError:
        # do something else

এর অর্থ হ'ল আপনার কোড ব্যবহার করা অন্য যে কোনও একটি আসল অভিধান বা সাবক্লাস ব্যবহার করতে হবে না - তারা ম্যাপিং ইন্টারফেস প্রয়োগকারী কোনও বস্তু ব্যবহার করতে পারে।

দুর্ভাগ্যক্রমে অনুশীলনে এটি এত সহজ নয়। উপরের উদাহরণে সদস্য যদি একটি পূর্ণসংখ্যা হতে পারে তবে কী হবে? পূর্ণসংখ্যার পরিবর্তনযোগ্য - তাই এগুলি অভিধান কী হিসাবে ব্যবহার করা পুরোপুরি যুক্তিসঙ্গত। তবে সেগুলি সিকোয়েন্স টাইপ অবজেক্টগুলিকেও সূচী করতে ব্যবহৃত হয়। সদস্য যদি একটি পূর্ণসংখ্যা হিসাবে দেখা দেয় তবে উদাহরণ দুটি তালিকা এবং স্ট্রিং পাশাপাশি অভিধানের মাধ্যমে দিতে পারে।

জোরালো প্রোগ্রামিং সম্পর্কে :

বাগগুলি ধরার লক্ষ্য নিয়ে প্রোগ্রামারের প্রত্যাশার মতো কোনও প্রোগ্রামের অভ্যন্তরীণ অবস্থা যেমন রয়েছে তা যাচাই করার জন্য জোর দেওয়া পদ্ধতিগত উপায়। বিশেষত, কোডটি লেখার সময় করা হয়েছিল এমন মিথ্যা অনুমানগুলি ধরা বা অন্য প্রোগ্রামার দ্বারা কোনও ইন্টারফেসের অপব্যবহার করার জন্য তারা ভাল they তদতিরিক্ত, তারা প্রোগ্রামারের অনুমানগুলি সুস্পষ্ট করে কিছু পরিমাণে ইন-লাইন ডকুমেন্টেশন হিসাবে কাজ করতে পারে। ("স্পষ্ট বর্ণিত চেয়ে ভাল।")

উল্লিখিত ধারণাগুলি কখনও কখনও দ্বন্দ্বের মধ্যে থাকে, তাই আমি যখন কোনও ডেটা বৈধতা না করি, দৃ strong় বৈধতা না করি বা দৃ use়পদ ব্যবহার করি তা বেছে নেওয়ার সময় আমি নিম্নলিখিত কারণগুলির উপর নির্ভর করি:

  1. শক্তিশালী বৈধতা। শক্তিশালী বৈধতার দ্বারা আমার অর্থ একটি কাস্টম ব্যতিক্রম উত্থাপন ( ApiErrorউদাহরণস্বরূপ)। যদি আমার ফাংশন / পদ্ধতিটি সর্বজনীন এপিআইয়ের অংশ হয় তবে অপ্রত্যাশিত ধরণের সম্পর্কে ভাল ত্রুটি বার্তাটি দেখানোর পক্ষে যুক্তিটি বৈধতা দেওয়া ভাল। প্রকারটি পরীক্ষা করে আমি বোঝাতে চাইছি না কেবল isinstanceতবে ব্যবহার করা বস্তুটি প্রয়োজনীয় ইন্টারফেসটিকে সমর্থন করে (হাঁসের টাইপিং)। আমি এপিআই নথিভুক্ত করার সময় এবং প্রত্যাশিত প্রকারটি নির্দিষ্ট করে দিলে এবং ব্যবহারকারী আমার অপ্রত্যাশিত উপায়ে আমার ফাংশনটি ব্যবহার করতে চাইতে পারে, তবে অনুমানগুলি পরীক্ষা করে আমি নিরাপদ বোধ করি। আমি সাধারণত ব্যবহার করি isinstanceএবং পরে যদি আমি অন্য ধরণের বা হাঁসকে সমর্থন করতে চাই তবে আমি বৈধতা যুক্তিটি পরিবর্তন করি।

  2. জোরদার প্রোগ্রামিং। যদি আমার কোডটি নতুন হয় তবে আমি প্রচুর পরিমাণে সংস্থান ব্যবহার করি। এই সম্পর্কে আপনার পরামর্শ কি? আপনি কি পরে কোড থেকে সম্পদগুলি সরিয়ে ফেলবেন?

  3. যদি আমার ফাংশন / পদ্ধতি কোনও এপিআইয়ের অংশ না হয় তবে এর কিছু যুক্তি অন্য কোনও কোডের মাধ্যমে দিয়ে যায় যা আমার দ্বারা লিখিত, অধ্যয়ন করা বা পরীক্ষিত হয় না, আমি তথাকথিত ইন্টারফেস অনুযায়ী প্রচুর দৃ .়তা করি। এর পেছনে আমার যুক্তি - আমার কোডে আরও ভাল ব্যর্থ, তারপরে কোথাও 10 লেভেল গভীরভাবে স্ট্যাকট্র্যাসে অজানা ত্রুটি যা আরও অনেক ডিবাগ করতে বাধ্য করে এবং পরে আমার কোডটিতে দৃsert়তা যুক্ত করে।

প্রকার / মান বৈধতা কখন ব্যবহার করবেন বা ব্যবহার করবেন না সে বিষয়ে মন্তব্য এবং পরামর্শগুলি? প্রশ্নের সেরা গঠনের জন্য না দুঃখিত।

উদাহরণস্বরূপ নিম্নলিখিত ফাংশনটি বিবেচনা করুন, যেখানে Customerএকটি এসকিউএএলএলচেমি ঘোষণামূলক মডেল রয়েছে:

def add_customer(self, customer):
    """Save new customer into the database.
    @param customer: Customer instance, whose id is None
    @return: merged into global session customer
    """
    # no validation here at all
    # let's hope SQLAlchemy session will break if `customer` is not a model instance
    customer = self.session.add(customer)
    self.session.commit()
    return customer

সুতরাং, বৈধতা পরিচালনা করার বিভিন্ন উপায়:

def add_customer(self, customer):
    # this is an API method, so let's validate the input
    if not isinstance(customer, Customer):
        raise ApiError('Invalid type')
    if customer.id is not None:
        raise ApiError('id should be None')

    customer = self.session.add(customer)
    self.session.commit()
    return customer

অথবা

def add_customer(self, customer):
    # this is an internal method, but i want to be sure
    # that it's a customer model instance
    assert isinstance(customer, Customer), 'Achtung!'
    assert customer.id is None

    customer = self.session.add(customer)
    self.session.commit()
    return customer

আপনি কখন এবং কেন এই প্রত্যেকটি হাঁসের টাইপিং, টাইপ চেকিং, ডেটা বৈধকরণের প্রসঙ্গে ব্যবহার করবেন?


1
পারফরম্যান্স কারণে না হলে আপনি কেবল ইউনিট টেস্টের মতো জাল মুছে ফেলবেন না
ব্রায়ান চেন

উত্তর:


4

আমাকে কিছু গাইডিং নীতি দিন।

মূল নীতি # 1। Http://docs.python.org/2/references/simple_stmts.html তে উল্লিখিত হিসাবে , ডিবাগিংয়ের জন্য থাকা অবস্থায় কমান্ড লাইন বিকল্পের সাহায্যে দৃ as়তার ওভারহেড কমান্ড লাইন অপসারণ করা যাবে। পারফরম্যান্স যদি সমস্যা হয় তবে তা করুন। জোর ছেড়ে দিন। (তবে জোর দিয়ে গুরুত্বপূর্ণ কিছু করবেন না!)

মূল নীতি # 2। আপনি যদি কিছু দৃser়ভাবে বলছেন, এবং এতে মারাত্মক ত্রুটি ঘটেছে তবে একটি প্রতিস্থাপন ব্যবহার করুন। অন্য কিছু করার একেবারেই মূল্য নেই। পরে যদি কেউ এটি পরিবর্তন করতে চান তবে তারা আপনার কোড পরিবর্তন করতে পারে বা সেই পদ্ধতি কলটি এড়াতে পারে।

মূল নীতি # 3। কিছু বারণ করবেন না কারণ আপনি মনে করেন এটি করা বোকামি জিনিস a সুতরাং যদি আপনার পদ্ধতিটি স্ট্রিংগুলির মাধ্যমে অনুমতি দেয়? এটি যদি কাজ করে তবে তা কাজ করে।

নীতি # 4। সম্ভাব্য ভুলের লক্ষণগুলি এমন জিনিসগুলি বাতিল করুন। উদাহরণস্বরূপ বিকল্পগুলির একটি অভিধান পাস করার বিষয়টি বিবেচনা করুন। যদি সেই অভিধানে এমন জিনিস থাকে যা বৈধ বিকল্প নয়, তবে এটি এমন একটি চিহ্ন যে কেউ আপনার এপিআই বুঝতে পারে না, বা অন্যথায় টাইপও করেছে। কাউকে যুক্তিসঙ্গত কাজ করতে বাধা দেওয়ার চেয়ে টাইপো ধরা পড়ার সম্ভাবনা বেশি on

প্রথম 2 নীতিগুলির ভিত্তিতে, আপনার দ্বিতীয় সংস্করণটি ফেলে দেওয়া যেতে পারে। আপনি অন্য দুজনের মধ্যে কোনটি পছন্দ করেন তা স্বাদের বিষয়। আপনি কোনটি সম্ভবত বেশি ভাবেন? যে কেউ একজন অ-গ্রাহককে পাস করবে add_customerএবং জিনিসগুলি ভেঙে যাবে (যার ক্ষেত্রে সংস্করণ 3 পছন্দ করা হয়েছে), বা যে কোনও সময় আপনার গ্রাহককে কোনও প্রকারের প্রক্সি অবজেক্টের সাথে প্রতিস্থাপন করতে চাইবে যা সমস্ত সঠিক পদ্ধতিতে সাড়া দেয় (যার ক্ষেত্রে সংস্করণ 1 পছন্দ করা হয়)।

ব্যক্তিগতভাবে আমি উভয় ব্যর্থতা মোড দেখেছি। আমি সাধারণ অধ্যয়নের বাইরে সংস্করণ 1 এ যেতে চাই যে আমি অলস এবং এটি টাইপিং কম। (এছাড়াও সেই ধরণের ব্যর্থতা সাধারণত খুব তাড়াতাড়ি বা পরে মোটামুটি সুস্পষ্ট উপায়ে প্রদর্শিত হয় And অন্যভাবে যেতে হবে।


আমি v.3 পছন্দ করি, বিশেষত ইন্টারফেস ডিজাইন করার সময় - নতুন ক্লাস এবং পদ্ধতিগুলি লেখার জন্য। এছাড়াও আমি v.3 এপিআই পদ্ধতিগুলির জন্য দরকারী বিবেচনা করি - কারণ আমার কোড অন্যদের জন্য নতুন। আমি মনে করি দৃser় পদ্ধতির একটি ভাল আপস, কারণ এটি অনুকূলিত মোডে চলার সময় উত্পাদনে সরানো হয়। > কাউকে যুক্তিসঙ্গত কাজ করতে বাধা দেওয়ার চেয়ে টাইপো ধরা পড়ার সম্ভাবনা বেশি। <সুতরাং, আপনি এই জাতীয় বৈধতা আপত্তি করবেন না?
ওয়ারওয়ারিচ

এইভাবে রাখা যাক। আমি পাই যে উত্তরাধিকারের মানচিত্রগুলি কীভাবে আমি ডিজাইনগুলি বিকাশ করতে পছন্দ করি তার পক্ষে দুর্বল। আমি রচনা পছন্দ। সুতরাং আমি দৃ that়তা প্রকাশ করে বলছি যে এটি অবশ্যই এই শ্রেণীর হতে হবে from তবে আমি এমন দৃশ্যের বিরোধিতা করি না যেখানে আমি মনে করি যে তারা আমাকে কিছু সঞ্চয় করে।
বুটিলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.