दिलचस्प पोस्ट
जीसीसी में std :: put_time कार्यान्वयन स्थिति? मैं सरल डेटाबेस और वेबसैक्यिटी के साथ अपने डेटाबेस का उपयोग कैसे करूं? MVC4 सुरक्षा क्या है? फेसबुक ग्राफ़ एपीआई 2.2 से 2.3 तक काम नहीं करती mysql जांचें कि क्या संख्या अल्पविराम से अलग की गई सूची में हैं JUnit के साथ यूनिट परीक्षण के लिए IntelliJ IDEA को कॉन्फ़िगर करना बहु-मान चयन बक्से से चयनित मूल्य प्राप्त करें jquery-select2 द्वारा? बिना किसी लूप के कुंजी के द्वारा बहुआयामी सरणी का योग मान डब्ल्यूसीएफ बनाम एएसपी.नेट वेब एपीआई jQuery के सभी पाठ क्षेत्रों में मूल्यों की योग की गणना मिलान वाइल्डकार्ड सख्त है, लेकिन तत्व 'टीएक्स: एनोटेशन-डायरेक्ट' के लिए कोई घोषणा नहीं मिल सकती है jQuery के यूआई accordion कि कई वर्गों खुला रहता है? सी # में वेबसाइट से एचटीएमएल कोड प्राप्त करें मैं एक घुमावदार मार्ग के साथ एक दृश्य या छवि के आंदोलन को कैसे सजीव कर सकता हूं? कैसे एक सरणी में एक सीमांकित स्ट्रिंग को विभाजित करने के लिए awk? टर्नरी हालत में अप्रत्यक्ष रूपांतरण मुद्दा

क्या `मॉड्यूल आयात फ़ंक्शन से` आयात मॉड्यूल बेहतर कोडिंग शैली है?

from module import function को एफएमआईआईफ़ कोडन शैली कहा जाना चाहिए।

import module को आईएम कोडन शैली कहा जाना चाहिए।

from package import module आइए, एफपीआईएम कोडन शैली कहें।

आईएम + एफएमपीआईएम एफएमआईएफ़ की तुलना में बेहतर कोडिंग शैली क्यों माना जाता है? (इस प्रश्न के लिए प्रेरणा के लिए इस पोस्ट को देखें।)

यहां कुछ मानदंड दिए गए हैं जो मुझे आईएम पर एफएमआईएफ़ पसंद करते हैं:

  1. कोड की कमी: यह मुझे कम फ़ंक्शन नामों का उपयोग करने की अनुमति देता है और इस प्रकार 80 कॉलम-प्रति-लाइन सम्मेलन को छड़ी करने में मदद करता है।
  2. पठनीयता: chisquare(...) अधिक scipy.stats.stats.chisquare(...) से scipy.stats.stats.chisquare(...) । हालांकि यह एक व्यक्तिपरक मानदंड है, मुझे लगता है कि ज्यादातर लोग सहमत होंगे।
  3. पुनर्निर्देशन की आसानी: यदि मैं FMIF का उपयोग करता हूं और कुछ कारणों से किसी कारण के लिए module बजाय alt_module से function को परिभाषित करने के लिए अजगर का पुनर्निर्देश करना चाहते हैं तो मुझे सिर्फ एक पंक्ति बदलने की आवश्यकता है: from alt_module import function अगर मैं आईएम का उपयोग कर रहा था, तो मुझे कई लाइनों को बदलना होगा।

मुझे एहसास है कि एफपीआईएम पहले दो मुद्दों को समाप्त करने के लिए कुछ हद तक चला जाता है, लेकिन तीसरे के बारे में क्या है?

मुझे सभी कारणों में दिलचस्पी है कि आईएम + एफपीआईएम एफएमआईफ़ से बेहतर क्यों हो सकता है, लेकिन विशेष रूप से, मुझे यहां वर्णित निम्नलिखित बिंदुओं पर विस्तार में दिलचस्पी होगी:

आईएम के लिए पेशेवरों:

  1. परीक्षणों में मजाक / इंजेक्शन लगाने में आसानी (मैं मजाक से बहुत परिचित नहीं हूं, हालांकि हाल ही में मैंने सीखा है कि शब्द का क्या मतलब है। क्या आप कोड दिखा सकते हैं जो आईएम एफएमआईफ़ से बेहतर है?
  2. कुछ प्रविष्टियों को पुनः परिभाषित करके आसानी से बदलने के लिए मॉड्यूल की क्षमता। (मुझे कुछ ग़लत समझा जाना चाहिए, क्योंकि यह आईएम पर एफएमआईआईएफ़ का लाभ होता है। ऊपर की ओर एफएमआईआई के पक्ष में मेरी तीसरी वजह देखें।)
  3. आपके डेटा की क्रमिकरण और वसूली पर पूर्वानुमान और नियंत्रणीय व्यवहार। (मैं सच में नहीं समझता कि आईएम या एफएमआईएफ की पसंद इस मुद्दे को कैसे प्रभावित करती है। कृपया विस्तृत करें।)
  4. मैं समझता हूं कि एफएमआईएफ "मेरे नाम स्थान को प्रदूषित करता है", लेकिन नकारात्मक-लगने वाला वाक्यांश होने के बावजूद, मैं इस बात की सराहना नहीं करता कि इस कोड को किसी ठोस तरीके से कैसे दर्द होता है।

पुनश्च। इस प्रश्न को लिखते समय मुझे एक चेतावनी मिली कि प्रश्न व्यक्तिपरक दिखता है और बंद होने की संभावना है। कृपया इसे बंद न करें मैं व्यक्तिपरक राय नहीं देख रहा हूँ, बल्कि ठोस कोडन स्थितियों में जहां आईएम + एफपीआईएम एफएमआईएफ़ की तुलना में बेहतर है

बहुत धन्यवाद।

Solutions Collecting From Web of "क्या `मॉड्यूल आयात फ़ंक्शन से` आयात मॉड्यूल बेहतर कोडिंग शैली है?"

आईएम / एफपीआईएम के लिए आपके द्वारा निगेट किए गए नकारात्मक अक्सर क्लाउज के उपयुक्त उपयोग से सुधार किया जा सकता है from some.package import mymodulewithalongname as mymod उपयोगी from some.package import mymodulewithalongname as mymod आपके कोड को छोटा कर सकते हैं और इसकी पठनीयता को बढ़ा सकते हैं, और यदि आप अपने mymodulewithalongname का नाम बदल सकते हैं, तो somethingcompletelydifferent कल, as खंड को संपादित करने के लिए एक एकल कथन के रूप में उपयोग किया जा सकता है।

अपने समर्थक- एफएमआईएफ पॉइंट 3 पर विचार करें (रीडायरेक्शन के लिए आर कॉल करें) आपके समर्थक- एफपीआईएम बिंदु 2 (लचीलापन के लिए इसे बुलाओ): आर मॉड्यूल सीमाओं की अखंडता के नुकसान की सुविधा के लिए, जबकि एफ इसे मजबूत करता है। एक मॉड्यूल में एकाधिक फ़ंक्शंस, क्लासेस और वेरिएबल्स अक्सर एक साथ काम करने का इरादा है: उन्हें अलग-अलग अर्थों में स्वतंत्र रूप से स्विच नहीं किया जाना चाहिए। उदाहरण के लिए, मॉड्यूल random और इसके कार्यों के seed और uniform : यदि आप उनमें से सिर्फ एक को अलग-अलग मॉड्यूल में आयात करने के लिए स्विच करना चाहते हैं, तो आप seed कॉल के बीच सामान्य कनेक्शन को तोड़ सकते हैं और uniform के कॉल के परिणामों को तोड़ सकते हैं। जब एक मॉड्यूल अच्छी तरह से तैयार किया जाता है, तो सामंजस्य और अखंडता के साथ, आर की मॉड्यूल की सीमाओं को तोड़ने की सुविधा वास्तव में एक नकारात्मक है – यह ऐसा कुछ करना आसान बनाता है जिसे आप बेहतर नहीं कर रहे हैं

इसके विपरीत, एफ जो युग्मित कार्यों, वर्गों और वेरिएबल्स के समन्वयित स्विचिंग को सक्षम करता है (इसलिए, आमतौर पर, संस्थाओं की, जो एक साथ मिलकर, मॉड्युलरिटी के द्वारा)। उदाहरण के लिए, परीक्षण दोहराए जाने योग्य (एफपीआईएम समर्थक बिंदु 1) बनाने के लिए, आप दोनों seed random मॉड्यूल में random बनाते हैं, और अगर आपका कोड FPIM का अनुसरण करता है, तो आप सभी सेट, समन्वय की गारंटी देते हैं; लेकिन अगर आपके पास कोड है जो फ़ंक्शन को सीधे आयात किया है, तो आपको प्रत्येक ऐसे मॉड्यूल का शिकार करना होगा और बार-बार मजाक और दोबारा ज़ाहिर करना होगा। पूरी तरह से दोहराने वाले परीक्षणों को सामान्य रूप से तिथि और समय कार्यों के "समन्वित मॉकिंग" की आवश्यकता होती है – यदि आप कुछ मॉड्यूल में from datetime import datetime उपयोग करते हैं, तो आपको उन सभी को खोजने और नकल करने की आवश्यकता होती है (साथ ही साथ सभी from time import time कर रहे हैं इतना आगे) यह सुनिश्चित करने के लिए कि सभी बार प्राप्त हुए जब सिस्टम के विभिन्न हिस्सों से पूछा "तो यह समय अब ​​क्या है?" पूरी तरह सुसंगत हैं (यदि आप एफपीआईएम का उपयोग करते हैं, तो आप सिर्फ दो प्रासंगिक मॉड्यूलों का नकली)

मुझे एफपीआईएम पसंद है, क्योंकि वास्तव में एक योग्य योग्यता के बजाय गुणात्मक योग्य नाम का उपयोग करके बहुत ज्यादा मूल्य नहीं है (जबकि बेरमेन और योग्य नामों के बीच का अंतर बहुत बड़ा है – आप एक योग्य नाम से अधिक नियंत्रण प्राप्त करते हैं , अकेले इसे या गुणा, आप संभवतः कभी भी एक barename के साथ कर सकते हैं!)।

आह अच्छी तरह से, अपने सभी अंकों को उत्तर देने के लिए सभी कार्य दिवसों को समर्पित नहीं कर सकते हैं – आपका प्रश्न शायद आधा दर्जन प्रश्न होना चाहिए 😉 मुझे उम्मीद है कि यह कम से कम पते "आर से बेहतर एफ क्यों है" और कुछ मजाक / परीक्षण के मुद्दों – यह (आर के माध्यम से) को कम करने के बजाय अच्छी तरह से डिज़ाइन किए गए मॉड्यूलरिटी (एफ के माध्यम से) को बनाए रखने और बढ़ाने के लिए उकसाता है।

इस पर क्लासिक पाठ, जितनी बार, फ़्रेड्रिक लुंड से है, इलेक्ट्रोन उनकी सलाह: हमेशा आयात का उपयोग करें – सिवाय जब आपको नहीं चाहिए

दूसरे शब्दों में, समझदार हो। व्यक्तिगत रूप से मुझे लगता है कि कुछ मॉड्यूल जो गहरे हैं from xyz import a द्वारा आयात के माध्यम from xyz import a आयात करने के लिए जाते हैं – जेगो मॉडल का मुख्य उदाहरण लेकिन जितना कुछ भी उतना ही अधिक है, यह शैली का मामला है, और आपके पास लगातार एक होना चाहिए – विशेष रूप से दिन- datetime जैसे मॉड्यूल के साथ, जहां दोनों मॉड्यूल और उसमें वर्ग शामिल हैं, उन्हें एक ही बात कहा जाता है। क्या आपको datetime.datetime.now() या सिर्फ datetime.now() लिखने की आवश्यकता है? (मेरे कोड में, हमेशा पूर्व।)

आपके प्रश्नों की सूची में आइटम 1 और 2 समान मुद्दे हैं। पायथन की गतिशील प्रकृति का मतलब है कि किसी मॉड्यूल के नाम स्थान में एक आइटम को बदलने के लिए यह काफी आसान है, चाहे आप किस तरीकों से उपयोग करें कठिनाई आती है अगर एक मॉड्यूल में एक समारोह दूसरे को संदर्भित करता है, जो कि आप नकली चाहते हैं। इस मामले में, फ़ंक्शन का उपयोग करने के बजाय मॉड्यूल आयात करने का मतलब है कि आप मॉड्यूल कर सकते हैं। module.function_to_replace = myreplacementfunc और सब कुछ पारदर्शी रूप से काम करता है – लेकिन यह एफएमपी के माध्यम से करना आसान है क्योंकि यह आईएम के माध्यम से है

मैं यह भी नहीं समझता कि आइटम 3 में कुछ भी करने के लिए कुछ भी नहीं है। मुझे लगता है कि आपका आइटम 4, हालांकि, कुछ गलतफहमी के आधार पर है। आपके द्वारा दिए जाने वाले तरीकों में से कोई भी 'आपके नेमस्पेस प्रदूषित नहीं करेगा' ऐसा क्या करता है जो from module import * , जहां आप सब कुछ जानते हैं कि आप क्या आयात कर रहे हैं और ऐसा कार्य आपके कोड में आपके पाठक को दिए गए संकेत के बिना दिखाई दे सकते हैं जहां वे आए। यह भयानक है, और हर कीमत पर बचा जाना चाहिए।

एलेक्स मार्टले की तरह, मैं एक फ़ंक्शन को आयात करते समय उपयोग करने के शौकीन हूं।

मैंने जो काम किया है, वह सब मॉडलों से आयात किए गए सभी कार्यों पर कुछ उपसर्ग का उपयोग करना है:

 from random import seed as r_seed from random import random as r_random 

r_seed से टाइप करने के लिए कम है। लेकिन कुछ हद तक मॉड्यूल सीमाओं को संरक्षित करता है। किसी को आकस्मिक रूप से आपके कोड को देखकर r_seed() और r_random() देख सकते हैं और r_random() मौका मिला है कि वे संबंधित हैं।

बेशक, आप हमेशा यह कर सकते हैं:

 import random as r 

और फिर r.random() और r.seed() , जो इस मामले के लिए आदर्श समझौता हो सकता है। मैं केवल उपसर्ग चाल का उपयोग करता हूँ जब मैं एक मॉड्यूल से एक या दो फ़ंक्शन आयात कर रहा हूं। जब मैं एक ही मॉड्यूल से कई फ़ंक्शन का उपयोग करना चाहता हूं, तो मैं मॉड्यूल को आयात करूँगा, संभवतः नाम को छोटा करने के साथ।

यहां बहुत अच्छे उत्तर दिए गए हैं (मैंने उनको ऊपर उठाया था), और यहां इस मामले पर मेरा विचार है:

सबसे पहले, अपनी हर बुलेट को संबोधित करते हुए:

(कथित तौर पर) एफएमआईएफ के पेशेवरों:

  • कोड की कमी: कम फ़ंक्शन के नाम 80 कॉलम-प्रति-लाइन में छड़ी करते हैं

शायद, लेकिन मॉड्यूल नाम आमतौर पर बहुत कम होते हैं, इसलिए यह प्रासंगिक नहीं है। बेशक, वहाँ datetime , लेकिन os , re , sys , आदि। और पायथन के पास मुफ्त लाइन ब्रेक्स है I

  • पठनीयता: chisquare (…) अधिक पढ़ें पटकथा से scipy.stats.stats.chisquare (…)।

दृढ़तापूर्वक असहमत। जब विदेशी कोड पढ़ना (या कुछ महीने बाद मेरा अपना कोड) यह जानना कठिन है कि प्रत्येक फ़ंक्शन कहां से आता है। योग्य नाम मुझे 2345 लाइन से आगे और पीछे जाने से मॉड्यूल घोषणाएं शीर्षक भेजते हैं। और यह आपको संदर्भ भी देता है : " chisquare ? वो क्या है? ओह, यह scypy ? ठीक है, कुछ गणित से संबंधित सामान" और, एक बार फिर, आप हमेशा scipy.stats.stats as scypyst संक्षिप्त कर सकते हैं। एक योग्य नाम के सभी लाभों के साथ scypyst.chisquare(...) पर्याप्त रूप से छोटा है।

import os.path as osp करना एक अच्छा उदाहरण है, यह एक ही कॉल में 3 या उससे अधिक कार्य को श्रृंखला के लिए बहुत ही सामान्य है: एक साथ जुड़ें (विस्तारक (), बेसनेम (स्प्लिटेक्स्ट ()) आदि।

  • रीडायरेक्शन की आसानी: मॉड्यूल के बजाय altmodule से फ़ंक्शन के एक-लाइन पुन: परिभाषा।

आप कितनी बार एक फ़ंक्शन को फिर से परिभाषित करना चाहते हैं, लेकिन पूरे मॉड्यूल नहीं? मॉड्यूल की सीमाएं और फ़ंक्शन समन्वय को संरक्षित किया जाना चाहिए, और एलेक्स ने पहले ही इसे महान गहराई में समझाया है। अधिकांश (सभी?) वास्तविक-विश्व परिदृश्यों के लिए, यदि alt_module.x लिए एक व्यवहार्य प्रतिस्थापन है, तो संभवतः alt_module ही module लिए विकल्प में एक बूंद है, इसलिए आईएम और एफपीआईएम दोनों ही एफएमआईएफ़ जैसे एक-लाइनर हैं आप के as उपयोग करें

  • मुझे एहसास है कि एफपीआईएम पहले दो मुद्दों को समाप्त करने के लिए कुछ रास्ता …

दरअसल, as कि पहले 2 मुद्दों (और 3) को कम करता है, एफपीआईएम नहीं। आप उस के लिए आईएम का उपयोग भी कर सकते हैं: import some.long.package.path.x as x के रूप में कुछ। Long.package.path.x import some.long.package.path.x as x


इसलिए उपरोक्त में से कोई भी वास्तव में एफएमआईएफ की तरफ नहीं है और मैं आईएम / एफपीआईएम को पसंद करने वाले कारण हैं:

सादगी और स्थिरता के लिए, जब मैं कुछ आयात करता हूं, या तो आईएम या एफपीआईएम, मैं हमेशा एक मॉड्यूल आयात कर रहा हूं, न कि एक मॉड्यूल से ऑब्जेक्ट। याद रखें कि एफएमआईफ़ (एबी) कार्यों, वर्गों, चर या अन्य मॉड्यूल को आयात करने के लिए इस्तेमाल किया जा सकता है! कुछ from somemodule import sys, somevar, os, SomeClass, datetime, someFunc गंदगी के बारे में सोचें।

इसके अलावा, यदि आप एक मॉड्यूल से एक ऑब्जेक्ट से ज्यादा चाहते हैं, तो एफएमआईएफ आईएम या एफपीआईएम से अधिक नामों को प्रदूषित करेगा, जो एक ही नाम का उपयोग करेगा, चाहे आप कितने ऑब्जेक्ट का उपयोग करना चाहते हैं। और इस तरह के ऑब्जेक्ट में एक योग्य नाम होगा, जो एक समर्थक है, एक समझौता नहीं है: जैसा कि मैंने इश्यू 2 में कहा है, आईएमएचओ ने इसे पठनीयता में सुधार किया है।

यह सब स्थिरता, सादगी, संगठन के लिए नीचे आता है। "आयात मॉड्यूल, ऑब्जेक्ट्स नहीं" एक अच्छा, आसान मन मॉडल है जिसके साथ रहना है।

मैं सबसे अधिक (और इसलिए एक upvote) MestreLion के साथ सहमत हूँ।

मेरा दृष्टिकोण: मैं बार-बार कोड की समीक्षा करता हूं कि मैं इससे अपरिचित हूं, और यह नहीं जानता कि फ़ंक्शन केवल फ़ंक्शन को देखने से क्या मॉड्यूल आ रहा है काफी निराशाजनक है

संहिता एक बार लिखी जाती है और कई बार पढ़ती है, और इसलिए पठनीयता और अनुरक्षण योग्यता टाइपिंग में आसानी होती है।

एक समान नस में, आमतौर पर कोड को कोडेर के लाभ के लिए नहीं लिखा जा रहा है, बल्कि किसी अन्य इकाई के लाभ के लिए।

आपका कोड किसी ऐसे व्यक्ति को पठनीय होना चाहिए, जो आपके से बेहतर अजगर जानता है, लेकिन कोड से अपरिचित है।

पूर्ण पथ आयात भी बेहतर हो सकता है IDE की ओर इंगित करता है कि आप फ़ंक्शन या ऑब्जेक्ट के सही स्रोत पर दिख रहे हैं।

इन सभी कारणों और कारणों के लिए मेस्ट्रेलियान ने कहा, मैंने निष्कर्ष निकाला है कि पूर्ण पथ का आयात और उपयोग करने का यह सर्वोत्तम अभ्यास है।