এক-লাইন ফাংশন দিয়ে তৈরি ডেটা মংগিং পাইপলাইনগুলির জন্য ইউনিট টেস্টিং


10

ফাংশনাল প্রোগ্রামিংয়ের জন্য মেরি রোজ কুকের ব্যবহারিক ভূমিকা পড়া এবং তিনি একটি অ্যান্টি-প্যাটার্নের উদাহরণ হিসাবে দিয়েছেন

def format_bands(bands):
    for band in bands:
        band['country'] = 'Canada'
        band['name'] = band['name'].replace('.', '')
        band['name'] = band['name'].title()

থেকে

  • ফাংশন একাধিক জিনিস করে
  • নাম বর্ণনামূলক নয়
  • এর পার্শ্ব প্রতিক্রিয়া রয়েছে

প্রস্তাবিত সমাধান হিসাবে, তিনি বেনাম ফাংশনগুলি পাইপলাইনের পরামর্শ দেন

pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
                      call(lambda x: x.replace('.', ''), 'name'),
                      call(str.title, 'name')])

তবে এটি আমার কাছে আরও কম পরীক্ষামূলক হওয়ার খারাপ দিকটি বলে মনে হচ্ছে; কমপক্ষে ফরম্যাট_ব্যান্ডগুলির একটি ইউনিট পরীক্ষা থাকতে পারে এটি যা যা বোঝায় তা পরীক্ষা করে তবে পাইপলাইনটি কীভাবে পরীক্ষা করা যায়? বা বেনামে ফাংশনগুলি এতটা স্বতঃস্ফূর্ত যে এগুলি পরীক্ষা করার দরকার নেই এমন ধারণাটি কি?

এটির জন্য আমার বাস্তব-বিশ্ব অ্যাপ্লিকেশনটি আমার pandasকোডটিকে আরও কার্যকর করার চেষ্টা করছে । আমি "মুং" ফাংশনটির ভিতরে প্রায়শই কিছু ধরণের পাইপলাইন পাইতাম

def munge_data(df)
     df['name'] = df['name'].str.lower()
     df = df.drop_duplicates()
     return df

বা পাইপলাইন স্টাইলে পুনর্লিখন:

def munge_data(df)
    munged = (df.assign(lambda x: x['name'].str.lower()
                .drop_duplicates())
    return munged

এই ধরণের পরিস্থিতিতে সেরা অনুশীলনের জন্য কোনও পরামর্শ?


4
সেই স্বতন্ত্র ল্যাম্বদা ফাংশনগুলি ইউনিট পরীক্ষার থেকে খুব ছোট। চূড়ান্ত ফলাফল পরীক্ষা করুন। এটিকে অন্য উপায়ে বলতে গেলে বেনামে ফাংশনগুলি ইউনিট টেস্টযোগ্য নয়, সুতরাং যদি আপনি পৃথকভাবে এটি পরীক্ষা করার পরিকল্পনা করেন তবে অজ্ঞাতনামা ফাংশন হিসাবে ফাংশনটি লিখবেন না।
রবার্ট হার্ভে

উত্তর:


1

আমি মনে করি আপনি সম্ভবত বইটির সংশোধিত উদাহরণের আরও গুরুত্বপূর্ণ অংশটি মিস করেছেন। কোডে আরও মৌলিক পরিবর্তন হ'ল তালিকার সমস্ত মানগুলিতে অপারেটিং পদ্ধতি থেকে একটি উপাদানকে পরিচালনা করে to

ইতিমধ্যে এখানে iter( যেমন এই নামে pipeline_foreach) ফাংশন রয়েছে যা তালিকার সমস্ত উপাদানগুলিতে প্রদত্ত ক্রিয়াকলাপ সম্পাদন করে। এটি forলুপ দিয়ে নকল করার প্রয়োজন ছিল না । এছাড়াও একটি সুপরিচিত তালিকা অপারেশন ব্যবহার আপনার উদ্দেশ্য পরিষ্কার করে। আপনার সাথে mapমানগুলি রূপান্তরিত হচ্ছে। সঙ্গে iterআপনি প্রতিটি উপাদান সঙ্গে একটি পার্শ্ব প্রতিক্রিয়া সম্পাদন করা হয়। সঙ্গে forতুমি লুপ ... ভাল, আপনি কি সত্যিই যতক্ষণ না আপনি এটা মাধ্যমে সন্ধান জানি না।

উদাহরণ সংশোধন কোডটি এখনও খুব কার্যকরী নয়, কারণ এটি (যতদূর আমি বলতে পারি) তালিকার মানগুলি ফেরত না করে পরিবর্তিত করে, আরও পাইপিং বা ফাংশন রচনা রোধ করে। কার্যকরীভাবে পছন্দসই পদ্ধতিটি mapআপডেট হওয়া countryএবং সহ ব্যান্ডগুলির একটি নতুন তালিকা তৈরি করবে name। তারপরে আপনি সেই আউটপুটটি পরবর্তী ফাংশনে পাইপ করতে পারেন বা mapকোনও ফাংশন যা একটি ব্যান্ড তালিকা নিয়েছিল তার সাথে রচনা করতে পারেন। সাথে iter, এটি একটি পাইপলাইনের মৃত প্রান্তের মতো।

আমি মনে করি শেষ ফলাফলের কোডের ছোট ছোট ফাংশন রয়েছে যা এখানে পরীক্ষার বিরক্ত করার পক্ষে খুব তুচ্ছ। সর্বোপরি, আপনার বিরুদ্ধে ইউনিট পরীক্ষা লেখার দরকার নেই replaceবা title। এখন সম্ভবত আপনি এগুলি একসাথে আপনার নিজস্ব ফাংশন এবং ইউনিট পরীক্ষায় রচনা করতে চান যে একটি আইটেমে কাঙ্ক্ষিত সংমিশ্রণটি অর্জন করা হয়েছে। নিজেই, আমি সম্ভবত স্রেফ একবাকলে পরিবর্তিত format_bandsহয়ে format_bandলুপের জন্য বাদ দিয়েছি এবং ডেকেছি pipeline_each(bands, format_band)। তারপরে আপনি কিছু ভুলে যাবেন না তা নিশ্চিত করতে আপনি ফর্ম্যাট_ব্যান্ড পরীক্ষা করতে পারেন।

যাইহোক, আপনার কোডে। আপনার কোডের দ্বিতীয় উদাহরণটি আরও পাইপলাইন-y বলে মনে হচ্ছে না। তবে এটি একা কার্যকরী প্রোগ্রামিংয়ের সুবিধা সরবরাহ করে না। অনুশীলনে, ফাংশনাল প্রোগ্রামিং মানে কেবলমাত্র ইনপুট এবং আউটপুটগুলির ক্ষেত্রে তাদের সামঞ্জস্যতা সংজ্ঞায়িত করে অন্যান্য ফাংশনের সাথে ফাংশনের সামঞ্জস্যতা নিশ্চিত করা। যদি ফাংশনের অভ্যন্তরে কোনও লুকানো পার্শ্ব প্রতিক্রিয়া থাকে, তবে এর ইনপুট / আউটপুটটি অন্যান্য ফাংশনের সাথে আবদ্ধ থাকা সত্ত্বেও, আপনি জানেন না যে এগুলি রান সময় পর্যন্ত সামঞ্জস্যপূর্ণ কিনা। তবে, দুটি ফাংশনগুলি পার্শ্ব-প্রতিক্রিয়া মুক্ত এবং আউটপুট-টু ইনপুট মেলাতে পারে তবে আপনি পাইপলাইন বা অপ্রত্যাশিত ফলাফলের সামান্য উদ্বেগ নিয়ে তাদের রচনা করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.