পাইথন কি দৃ strongly়ভাবে টাইপ করা হয়?


234

আমি লিঙ্কগুলি জুড়ে এসেছি যেগুলি বলে যে পাইথন একটি দৃ strongly়ভাবে টাইপ করা ভাষা।

তবে, আমি ভেবেছিলাম দৃ strongly়ভাবে টাইপ করা ভাষায় আপনি এটি করতে পারবেন না:

bob = 1
bob = "bob"

আমি ভেবেছিলাম দৃ strongly়ভাবে টাইপ করা ভাষা রান-টাইমে টাইপ-চেঞ্জিং গ্রহণ করে না। শক্তিশালী / দুর্বল প্রকারের একটি ভুল (বা খুব সরলবাদী) সংজ্ঞা পেয়ে থাকতে পারে।

তো, পাইথন কি একটি দৃ ?় বা দুর্বল টাইপ করা ভাষা?

উত্তর:


358

পাইথন দৃ strongly়ভাবে, গতিশীল টাইপ করা হয়।

  • শক্ত টাইপিংয়ের অর্থ হ'ল কোনও মানের প্রকার অপ্রত্যাশিত উপায়ে পরিবর্তন হয় না। পার্লের মতোই কেবল একটি সংখ্যার একটি স্ট্রিং ম্যাজিকালি কোনও সংখ্যাতে পরিণত হয় না। প্রতিটি ধরণের পরিবর্তনের জন্য একটি সুস্পষ্ট রূপান্তর প্রয়োজন।
  • ডায়নামিক টাইপিং মানে রানটটাইম অবজেক্টের (মান) একটি ধরণের থাকে, স্ট্যাটিক টাইপের বিপরীতে যেখানে ভেরিয়েবলগুলির একটি টাইপ থাকে।

যেমন আপনার উদাহরণ হিসাবে

bob = 1
bob = "bob"

এটি কাজ করে কারণ ভেরিয়েবলের কোনও প্রকার নেই; এটি কোনও বস্তুর নাম দিতে পারে। পরে bob=1, আপনি যে type(bob)রিটার্ন পাবেন int, কিন্তু পরে bob="bob"এটি ফিরে আসবে str। (দ্রষ্টব্য এটি typeএকটি নিয়মিত ফাংশন, সুতরাং এটি তার যুক্তিটি মূল্যায়ন করে, তারপরে মানটির ধরণটি দেয়))

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

আমার অবশ্যই যোগ করতে হবে যে শক্তিশালী বনাম দুর্বল টাইপিং বুলিয়ান পছন্দের চেয়ে বেশি ধারাবাহিকতা। সি ++ এর সি-এর চেয়ে বেশি টাইপিং রয়েছে (আরও রূপান্তর প্রয়োজন), তবে পয়েন্টার কাস্ট ব্যবহার করে টাইপ সিস্টেমটি বিভক্ত করা যেতে পারে।

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

def to_number(x):
    """Try to convert function argument to float-type object."""
    try: 
        return float(x) 
    except (TypeError, ValueError): 
        return 0 

class Foo:
    def __init__(self, number): 
        self.number = number

    def __add__(self, other):
        return self.number + to_number(other)

শ্রেণীর ইনস্ট্যান্স Fooঅন্যান্য অবজেক্টগুলিতে যুক্ত করা যেতে পারে:

>>> a = Foo(42)
>>> a + "1"
43.0
>>> a + Foo
42
>>> a + 1
43.0
>>> a + None
42

লক্ষ করুন যে যদিও দৃ strongly়ভাবে টাইপ করা পাইথন টাইপের অবজেক্ট যুক্ত করার সাথে পুরোপুরি ঠিক আছে intএবং টাইপের floatকোনও অবজেক্ট float(যেমন, int(42) + float(1)রিটার্ন 43.0) প্রদান করে। অন্যদিকে, হ্যাস্কেল প্রকারের মধ্যে মিল না থাকার কারণে কেউ যদি নিম্নলিখিতটি চেষ্টা করে তবে অভিযোগ করবে (42 :: Integer) + (1 :: Float)। এটি হাস্কেলকে কঠোরভাবে টাইপ করা ভাষায় পরিণত করে, যেখানে প্রকারগুলি সম্পূর্ণরূপে বিচ্ছিন্ন থাকে এবং কেবলমাত্র টাইপ শ্রেণীর মাধ্যমে ওভারলোডিংয়ের একটি নিয়ন্ত্রিত ফর্ম সম্ভব।


18
একটি উদাহরণ আমি প্রায়শই দেখতে পাই না তবে পাইথনটি পুরোপুরি দৃ strongly়ভাবে
gsingh2011

25
এটি যদি পাল্টা উদাহরণ হিসাবে নিশ্চিত হয় না: বিষয়গুলি বুলিয়ানকে মূল্যায়ন করতে পারে তবে তারা হঠাৎ বুলিয়ান "হয়ে ওঠে" না। এটি প্রায় সম্পূর্ণরূপে যদি কেউ অস্পষ্টভাবে as_boolean (<মান>) এর মতো কিছু বলেছিল, যা বস্তুর নিজেই পরিবর্তন হওয়ার মতো নয়, তাই না?
jbrendel

15
বুলিয়ান প্রসঙ্গে সত্যবাদী হওয়া কাউন্টারিক্স নমুনা নয়, কারণ কিছুই আসলে Trueবা তে রূপান্তরিত হচ্ছে না False। তবে সংখ্যা প্রচারের কী হবে? 1.0 + 2পাইথন যেমন পার্ল বা সি তে কাজ করে ঠিক তেমন কাজ করে, যদিও "1.0" + 2তা করে না। আমি @ জব্রেন্ডেলের সাথে একমত যে এটি সত্যিকার অর্থে অন্তর্নিহিত রূপান্তর নয়, এটি কেবলমাত্র ওভারলোডিং — তবে একই অর্থে পার্লও কোনও অন্তর্নিহিত রূপান্তর করছে না। যদি ফাংশনগুলি প্যারামিটারের প্রকারগুলি ঘোষণা না করে থাকে তবে অন্তর্নিহিত রূপান্তরগুলি ঘটানোর আর কোথাও নেই।
অবতারিত

13
শক্তিশালী টাইপিং সম্পর্কে ভাবার আরও ভাল উপায় হ'ল কোনও ভেরিয়েবলের উপর ক্রিয়াকলাপ সম্পাদন করার সময় সেই ধরণের বিষয়গুলি। প্রকারটি প্রত্যাশার মতো না হলে অভিযোগ করে এমন একটি ভাষা দৃ strongly়ভাবে টাইপ করা হয় (পাইথন / জাভা) এবং যেটি দুর্বলভাবে টাইপ করা হয় না (জাভাস্ক্রিপ্ট) ডায়নামিকালি টাইপ করা ভাষাগুলি (পাইথন) সেগুলি যা ভেরিয়েবলের ধরণকে পরিবর্তিত করতে দেয় রানটাইম যেখানে স্ট্যাটিকালি টাইপ করা ভাষা (জাভা) একবার ভেরিয়েবল ঘোষিত হওয়ার পরে এটির অনুমতি দেয় না।
কাশিফ

2
@ gsingh2011 সত্যতা দরকারী এবং নিজে দুর্বল টাইপিং নয় , তবে দুর্ঘটনাক্রমে if isValid(value) - 1ফাঁস হতে পারে। বুলিয়ান পূর্ণসংখ্যায় জোর করা হয়, যা পরে সত্যবাদী মান হিসাবে মূল্যায়ন করা হয়। False - 1সত্যবাদী হয়ে যায় এবং মিথ্যা True - 1হয়ে যায়, যার ফলে একটি বিব্রতকরভাবে কঠিন দ্বি-স্তরযুক্ত একের পর এক ত্রুটি ডিবাগ করা যায়। এই অর্থে, পাইথন বেশিরভাগ ক্ষেত্রে দৃ strongly়ভাবে টাইপ করা হয়; টাইপ জোর করে সাধারণত যৌক্তিক ত্রুটি ঘটায় না।
হারুন 3468

57

কিছু গুরুত্বপূর্ণ সমস্যা রয়েছে যা আমি মনে করি বিদ্যমান উত্তরগুলি সমস্ত মিস করেছে।


দুর্বল টাইপিং এর অর্থ অন্তর্নিহিত উপস্থাপনায় অ্যাক্সেসের অনুমতি দেওয়া। সি-তে আমি অক্ষরগুলির জন্য একটি পয়েন্টার তৈরি করতে পারি, তারপরে সংকলকটি বলুন যে আমি এটি পূর্ণসংখ্যার পয়েন্টার হিসাবে ব্যবহার করতে চাই:

char sz[] = "abcdefg";
int *i = (int *)sz;

32-বিট পূর্ণসংখ্যার সাথে সামান্য এন্ডিয়ান প্ল্যাটফর্মে i, এটি সংখ্যার অ্যারে তৈরি করে 0x64636261এবং 0x00676665। প্রকৃতপক্ষে, আপনি এমনকি তাদের পূর্ণসংখ্যার (উপযুক্ত আকারের) পয়েন্টারও কাস্ট করতে পারেন:

intptr_t i = (intptr_t)&sz;

এবং অবশ্যই এর অর্থ আমি সিস্টেমে যে কোনও জায়গায় মেমরির ওভাররাইট করতে পারি *

char *spam = (char *)0x12345678
spam[0] = 0;

* অবশ্যই আধুনিক ওএসের ব্যবহার ভার্চুয়াল মেমরি এবং পৃষ্ঠা সুরক্ষা যাতে আমি কেবল আমার নিজের প্রক্রিয়াটির স্মৃতিটিকে ওভাররাইট করতে পারি, তবে সি সম্পর্কে এমন কিছু নেই যা এই জাতীয় সুরক্ষা সরবরাহ করে, যে কেউ যে কখনও কোড করে বলেছিল, ক্লাসিক ম্যাক ওএস বা উইন 16 আপনাকে বলতে পারে।

Ditionতিহ্যবাহী লিস্প অনুরূপ ধরণের হ্যাকারির অনুমতি দেয়; কিছু প্ল্যাটফর্মে ডাবল-ওয়ার্ড ফ্লোট এবং কনস সেলগুলি একই ধরণের ছিল এবং আপনি কেবল অন্যটির প্রত্যাশা করে একটি ফাংশনে পাস করতে পারেন এবং এটি "কাজ করবে"।

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

* একটি চেক ডাউনডকাস্ট কেবল ভাষার টাইপ সিস্টেমকে দুর্বল করে না কারণ এটি চেকটিকে রানটাইম-এ স্থানান্তরিত করে। যদি এটি হয়ে থাকে তবে সাব-টাইপ পলিমারফিজম (ওরফে ভার্চুয়াল বা পুরো-গতিশীল ফাংশন কল) টাইপ সিস্টেমের একই লঙ্ঘন হবে এবং আমি মনে করি না যে কেউ এটি বলতে চায়।

খুব কম "স্ক্রিপ্টিং" ভাষা এই অর্থে দুর্বল। এমনকি পার্ল বা টিসিএল এ আপনি স্ট্রিং নিতে পারবেন না এবং কেবল এটির বাইটগুলি একটি পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করতে পারবেন না But তবে এটি লক্ষণীয় যে সিপিথনে (এবং একইভাবে অনেক ভাষার জন্য অন্যান্য বহু অনুবাদকের জন্য) আপনি যদি সত্যই অধ্যবসায়ী হন তবে আপনি ব্যবহার করতে পারেন ctypesআপ লোড করতে libpython, একটি বস্তুর নিক্ষেপ idএকটি থেকে POINTER(Py_Object), এবং লিক করতে টাইপ করুন সিস্টেম বাধ্য। এটি টাইপ সিস্টেমটিকে দুর্বল করে তোলে বা না আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে — আপনি যদি সুরক্ষা নিশ্চিত করতে কোনও ভাষা-নিষিদ্ধ সম্পাদনকারী স্যান্ডবক্স প্রয়োগ করতে চান তবে আপনাকে এই ধরণের পলায়ন নিয়ে মোকাবেলা করতে হবে…

* আপনি struct.unpackবাইটগুলি পড়ার মতো একটি ফাংশন ব্যবহার করতে পারেন এবং "কীভাবে সি এই বাইটগুলি উপস্থাপন করবে" এর বাইরে একটি নতুন ইনট তৈরি করতে পারে তবে এটি স্পষ্টতই ফাঁস নয়; এমনকি হাস্কেলও এটির অনুমতি দেয়।


এদিকে, অন্তর্নিহিত রূপান্তরটি একটি দুর্বল বা ফাঁসযুক্ত ধরণের সিস্টেম থেকে সত্যই আলাদা একটি জিনিস।

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

এবং গতিশীল ভাষাগুলি সহ, এটি বেশ বিরল। পাইথন বা পার্লে "এমন কোনও ফাংশন যা একটি ফ্লোট চায়" বলে কিছু নেই। তবে সেখানে ওভারলোডেড ফাংশন রয়েছে যা বিভিন্ন ধরণের সাথে বিভিন্ন জিনিস করে, এবং একটি শক্তিশালী স্বজ্ঞাত ধারণা রয়েছে যা উদাহরণস্বরূপ, অন্য কোনও স্ট্রিং যুক্ত করা "একটি স্ট্রিং চায় এমন ফাংশন" " সেই অর্থে পার্ল, টিসিএল এবং জাভাস্ক্রিপ্ট অনেকগুলি অন্তর্নিহিত রূপান্তরগুলি ( "a" + 1আপনাকে দেয় "a1") দেখায় , অন্যদিকে পাইথন অনেক কম কাজ করে ( "a" + 1একটি ব্যতিক্রম উত্থাপন 1.0 + 1করে তবে আপনাকে দেয় 2.0*)। এই অনুভূতিটিকে আনুষ্ঠানিক শর্তে putোকানো কেবল শক্ত — কেন সেখানে +স্ট্রিং এবং কোনও ইন্টি গ্রহণ করা উচিত নয় , যখন স্পষ্টতই অন্যান্য ক্রিয়াকলাপ যেমন সূচকের মতো থাকে, তখন কেন?

* আসলে, আধুনিক পাইথনে এটি ওও সাব টাইপিংয়ের ক্ষেত্রে ব্যাখ্যা করা যেতে পারে, যেহেতু isinstance(2, numbers.Real)এটি সত্য। আমি মনে করি না যে 2পার্ল বা জাভাস্ক্রিপ্টে স্ট্রিং টাইপের উদাহরণ রয়েছে এমন কোনও বোধ নেই … যদিও টিসিএল-তে এটি আসলে, কারণ সবকিছু স্ট্রিংয়ের উদাহরণ।


অবশেষে, আরও একটি সম্পূর্ণরূপে অরথগোনাল, "শক্তিশালী" বনাম "দুর্বল" টাইপিংয়ের সংজ্ঞা রয়েছে, যেখানে "শক্তিশালী" অর্থ শক্তিশালী / নমনীয় / ভাবপূর্ণ।

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

সুতরাং, সেই অর্থে, হাস্কেলের টাইপ সিস্টেমটি আধুনিক জাভার চেয়ে শক্তিশালী, যা পূর্বের জাভার চেয়ে শক্তিশালী, যা সি এর চেয়ে শক্তিশালী, যা বিসিপিএলের চেয়ে শক্তিশালী।

তো, পাইথন সেই বর্ণালীতে কোথায় ফিট? এটা কিছুটা কৃপণ। অনেক ক্ষেত্রে হাঁসের টাইপিং আপনাকে হাসকেলে যা করতে পারে তার সমস্ত কিছু এবং এমনকি কিছু কিছু যা আপনি নাও করতে পারেন তা অনুকরণ করতে দেয়; নিশ্চিত, সংকলন সময়ের পরিবর্তে রানটাইমগুলিতে ত্রুটিগুলি ধরা পড়ে, তবে তারা এখনও ধরা পড়ে। তবে, এমন কিছু ক্ষেত্রে রয়েছে যেখানে হাঁসের টাইপিং যথেষ্ট নয়। উদাহরণস্বরূপ, হাস্কেল-এ, আপনি বলতে পারেন যে খালি খালি তালিকায় অন্তরের তালিকা রয়েছে, তাই আপনি সিদ্ধান্ত নিতে পারেন যে +সেই তালিকাটি বাদ দিয়ে 0 * ফিরে আসা উচিত; পাইথনে, একটি খালি তালিকা খালি তালিকা; +এটির হ্রাস কী করা উচিত তা সিদ্ধান্ত নিতে আপনাকে সহায়তা করার জন্য কোনও ধরণের তথ্য নেই ।

* আসলে, হাস্কেল আপনাকে এটি করতে দেয় না; আপনি যদি হ্রাস ফাংশনটি কল করেন যা শূন্য তালিকায় কোনও প্রারম্ভিক মান নেয় না, আপনি একটি ত্রুটি পান। তবে এর টাইপ সিস্টেমটি যথেষ্ট শক্তিশালী যে আপনি এই কাজটি করতে পারেন, এবং পাইথনের তা নেই।


3
এই উত্তর উজ্জ্বল! লজ্জার বিষয় এটি তালিকার নীচে এত দিন ধরে রয়েছে।
লিওআর

1
আপনার সি উদাহরণটিতে কেবলমাত্র একটি সামান্য মন্তব্য: char sz[]চরের কোনও পয়েন্টার নয়, এটি চরের অ্যারে এবং অ্যাসাইনমেন্টে এটি পয়েন্টার হিসাবে স্থির হয়।
majkel.mk

39

আপনি বিভ্রান্ত হচ্ছে 'শক্তিশালী ভাবে টাইপ' সঙ্গে 'পরিবর্তনশীল টাইপ করা'

আমি 1স্ট্রিং যুক্ত করে প্রকারটি পরিবর্তন করতে পারি না '12', তবে আমি কোন পরিবর্তনশীলটিতে কী ধরণের সঞ্চয় করব তা চয়ন করতে পারি এবং প্রোগ্রামের চলাকালীন সময়ে এটি পরিবর্তন করতে পারি।

ডায়নামিক টাইপের বিপরীত স্থির টাইপিং; পরিবর্তনশীল ধরনের ঘোষণা একটি প্রোগ্রাম এর জীবদ্দশায় পরিবর্তন করে না। শক্তিশালী টাইপের বিপরীতটি দুর্বল টাইপিং; কোনও প্রোগ্রামের জীবদ্দশায় মানগুলির ধরণ পরিবর্তন হতে পারে।


লিঙ্কটির বিবরণটি দৃ strongly়ভাবে টাইপ করা হয়েছে: "সাধারণত, একটি দৃ typ়ভাবে টাইপ করা ভাষায় সংকলনের সময় কঠোর টাইপিং বিধি থাকে, যা বোঝায় যে সংকলনের সময় ত্রুটি এবং ব্যতিক্রম হওয়ার সম্ভাবনা বেশি থাকে।" ইঙ্গিত দেয় পাইথন একটি দুর্বল টাইপযুক্ত ভাষা ..., উইকি কি ভুল?
বৃষ্টি

1
@ s̮̦̩e̝͓c̮͔̞ṛ̖̖e̬̣̦t̸͉̥̳̼: এটি মোটেই নিহিত নয়। পাইথনের সংকলনের সময় টাইপিংয়ের কঠোর নিয়ম রয়েছে, তৈরি প্রতিটি বস্তুর কেবল একটি প্রকার রয়েছে। এবং 'সাধারণত' কোনও কিছু বোঝায় না, এর অর্থ কেবল পাইথন এটির ব্যতিক্রম।
মার্টিজন পিটারস

24

এই উইকি পাইথনের নিবন্ধ অনুসারে পাইথন দুটি গতিশীল এবং দৃ strongly়ভাবে টাইপ করা হয়েছে (এটিও একটি ভাল ব্যাখ্যা সরবরাহ করে)।

সম্ভবত আপনি স্থিতিযুক্ত টাইপ করা ভাষাগুলি সম্পর্কে ভাবছেন যেখানে প্রোগ্রামের সঞ্চালনের সময় প্রকারগুলি পরিবর্তন করতে পারে না এবং সম্ভাব্য ত্রুটিগুলি সনাক্ত করার জন্য টাইপ চেকিং সংকলনের সময় ঘটে।

এই এই প্রশ্নটি আগ্রহী হতে পারে: স্থির প্রকারের ভাষা এবং গতিবিধি সম্পর্কিত টাইপ সিস্টেমে সম্পর্কিত উইকিপিডিয়া নিবন্ধটি আরও তথ্য সরবরাহ করে


18

TLDR;

পাইথনের টাইপিং ডায়নামিক তাই আপনি একটি স্ট্রিং ভেরিয়েবলকে একটি ইন্টে পরিবর্তন করতে পারেন

x = 'somestring'
x = 50

পাইথন টাইপিং শক্তিশালী তাই আপনি প্রকারগুলি মার্জ করতে পারবেন না:

'foo' + 3 --> TypeError: cannot concatenate 'str' and 'int' objects

দুর্বল টাইপের জাভাস্ক্রিপ্টে এটি ঘটে ...

 'foo'+3 = 'foo3'

প্রকারের অনুক্রম সম্পর্কে

জাভা আপনাকে আপনার বস্তুর প্রকারগুলি স্পষ্টভাবে ঘোষণা করতে বাধ্য করে

int x = 50

কোটলিন অনুমানের জন্য এটি ব্যবহার করে usesint

x = 50

তবে উভয় ভাষা স্থির ধরণের ব্যবহার করে , xএকটি থেকে পরিবর্তন করা যায় না int। উভয়ই ভাষা গতিময় পরিবর্তনের অনুমতি দেয় না

x = 50
x = 'now a string'

আমি জাভাস্ক্রিপ্টের বিশদ জানি না তবে পর্দার আড়ালে ওভারলোডিং এবং ধরণের রূপান্তরটি 'x' + 3করা হতে পারে operator+?
বৃষ্টি হচ্ছে

3
যাইহোক, আপনার উত্তরটি উপরের উত্তরগুলির চেয়ে প্রকৃতপক্ষে আরও সংক্ষিপ্ত এবং বোঝা সহজ।
বৃষ্টি হচ্ছে

8

এটি ইতিমধ্যে কয়েকবার উত্তর দেওয়া হয়েছে, তবে পাইথন একটি দৃ strongly়ভাবে টাইপ করা ভাষা:

>>> x = 3
>>> y = '4'
>>> print(x+y)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

জাভাস্ক্রিপ্ট নিম্নলিখিত:

var x = 3    
var y = '4'
alert(x + y) //Produces "34"

এটি দুর্বল টাইপিং এবং শক্ত টাইপিংয়ের মধ্যে পার্থক্য। দুর্বল প্রকারগুলি প্রসঙ্গের (যেমন পার্ল) উপর নির্ভর করে স্বয়ংক্রিয়ভাবে এক ধরণের থেকে অন্য ধরণের রূপান্তরিত করার চেষ্টা করে। শক্তিশালী প্রকারগুলি কখনই স্পষ্টভাবে রূপান্তর করে না

আপনার বিভ্রান্তিটি পাইথন কীভাবে নামের সাথে মানগুলিকে আবদ্ধ করে (সাধারণত ভেরিয়েবল হিসাবে উল্লেখ করা হয়) একটি ভুল বোঝাবুঝির মধ্যে রয়েছে।

পাইথনে, নামের কোনও প্রকার নেই, তাই আপনি এই জাতীয় জিনিসগুলি করতে পারেন:

bob = 1
bob = "bob"
bob = "An Ex-Parrot!"

এবং নামগুলি যে কোনও কিছুর সাথে আবদ্ধ হতে পারে:

>>> def spam():
...     print("Spam, spam, spam, spam")
...
>>> spam_on_eggs = spam
>>> spam_on_eggs()
Spam, spam, spam, spam

আরও পড়ার জন্য:

https://en.wikipedia.org/wiki/Dynamic_dispatch

এবং সামান্য সম্পর্কিত কিন্তু আরও উন্নত:

http://effbot.org/zone/call-by-object.htm


1
বেশ কয়েক বছর পরে - অন্য দরকারী এবং প্রাসঙ্গিক সংস্থান: youtu.be/_AEJHKGk9ns
ওয়েন ওয়ার্নার

শক্তিশালী বনাম দুর্বল টাইপিংয়ের ফলাফলের ধরণের প্রকাশের সাথে 3 + '4' এর মতো কোনও সম্পর্ক নেই। জাভাস্ক্রিপ্ট এই উদাহরণটির জন্য পাইথনের মতোই শক্তিশালী।
qznc

@Qznc কীভাবে জাভাস্রিপ্ট ঠিক তত শক্ত? আমি বিশ্বাস করি না যে আমি অবহিত টাইপের সাথে এর কোনও যোগসূত্র জানিয়েছি, প্রকৃতপক্ষে আমি স্পষ্টতই বলেছি দুর্বল প্রকারগুলি স্বয়ংক্রিয়ভাবে এক প্রকার থেকে অন্য ধরণের রূপান্তরিত করার চেষ্টা করে
ওয়েন ওয়ার্নার

2
@ ইউনলুপ যা অগত্যা সত্য নয়, এটি ঠিক যে ফ্লোট এবং ইনটগুলির সংমিশ্রনের জন্য আচরণটি সঠিকভাবে সংজ্ঞায়িত হয়েছে এবং ফলশ্রুতিতে ফলস্বরূপ। আপনি "3"*4অজগর থেকেও করতে পারেন । অবশ্যই ফলাফল, হয় "3333"। আপনি এটি বলবেন না যে এটি কোনও জিনিসকে রূপান্তর করছে। অবশ্যই এটি শব্দার্থবিরোধী হতে পারে।
ওয়েন ওয়ার্নার

1
@ ইউনলুপ এটি অগত্যা সত্য নয় কারণ পাইথন floatএর সংমিশ্রণ থেকে বেরিয়ে আসে floatএবং intএটি প্রকারটিকে পুরোপুরি রূপান্তরিত করে। ভাসা এবং ইনট মধ্যে একটি প্রাকৃতিক সম্পর্ক আছে, এবং প্রকৃতপক্ষে, টাইপ উত্তরাধিকারসূত্রে বানান যে। আমি মনে করি যে আপনি জাভাস্ক্রিপ্টের পক্ষে তর্ক করতে পারতেন '3'+4এবং 'e'+4উভয়কেই একইভাবে পাইথনকে 3.0 + 4যথাযথভাবে সংজ্ঞায়িত বলে বিবেচনা করা হয়েছিল, তবে সেই সময়ে সত্যই শক্তিশালী বা দুর্বল প্রকারের মতো কিছুই নেই, ঠিক (আন) সংজ্ঞায়িত অপারেশন।
ওয়েন ওয়ার্নার

6

পাইথন ভেরিয়েবলটি লক্ষ্য অবজেক্টের একটি টাইপযুক্ত রেফারেন্স সঞ্চয় করে যা মানটির প্রতিনিধিত্ব করে।

যে কোনও অ্যাসাইনমেন্ট অপারেশন অর্থ নির্ধারিত বস্তুর জন্য টাইপযুক্ত রেফারেন্স অর্পণ করা - অর্থাৎ বস্তুটি মূল এবং নতুন (গণনা) রেফারেন্সের মাধ্যমে ভাগ করা হয়।

মান প্রকারটি লক্ষ্য বস্তুর সাথে আবদ্ধ, রেফারেন্স মানের সাথে নয়। (শক্তিশালী) প্রকারের পরীক্ষা করা যখন মান সহ একটি অপারেশন করা হয় (রান সময়)।

অন্য কথায়, ভেরিয়েবলগুলির (প্রযুক্তিগতভাবে) কোনও প্রকার নেই - যদি কেউ সঠিক হতে চায় তবে ভেরিয়েবলের ক্ষেত্রে বিবেচনা করা বুদ্ধিমান হবে না। কিন্তু রেফারেন্সগুলি স্বয়ংক্রিয়ভাবে অর্জিত হয় এবং আমরা আসলে লক্ষ্য বস্তুর ধরণের ক্ষেত্রে বিবেচনা করি।


6

"শক্তিশালী টাইপিং" শব্দটির একটি নির্দিষ্ট সংজ্ঞা নেই।

সুতরাং, এই শব্দটির ব্যবহার আপনি কার সাথে কথা বলছেন তার উপর নির্ভর করে।

আমি এমন কোনও ভাষা বিবেচনা করি না, যাতে কোনও ভেরিয়েবলের ধরণটি স্পষ্টভাবে ঘোষণা করা হয় না, বা দৃ stat়ভাবে টাইপ করার জন্য স্ট্যাটিকালি টাইপ করা হয় না।

শক্তিশালী টাইপিং কেবল রূপান্তরকে বিরত রাখে না (উদাহরণস্বরূপ, "স্বয়ংক্রিয়ভাবে" একটি পূর্ণসংখ্যা থেকে স্ট্রেনে রূপান্তর করে)। এটি অ্যাসাইনমেন্টকে বাদ দেয় (অর্থাত্ ভেরিয়েবলের ধরণ পরিবর্তন করে)।

যদি নিম্নলিখিত কোডগুলি সংকলন করে (ব্যাখ্যা করে), তবে ভাষাটি শক্ত-টাইপযুক্ত নয়:

ফু = 1 ফু = "1"

শক্তভাবে টাইপ করা ভাষায়, একজন প্রোগ্রামার কোনও প্রকারের "গণনা" করতে পারে can

উদাহরণস্বরূপ, যদি কোনও প্রোগ্রামার ঘোষণাটি দেখে,

UINT64 kZarkCount;

এবং তিনি বা তিনি জানেন যে 20 টি লাইন পরে, কেজার্কাউন্ট এখনও একটি ইউআইএনটি 64 (যতক্ষণ না এটি একই ব্লকের মধ্যে দেখা যায়) - হস্তক্ষেপের কোডটি পরীক্ষা না করেই।


1

আমি এটি মুখস্ত করার জন্য একটি দুর্দান্ত সংক্ষিপ্ত উপায় সবেমাত্র আবিষ্কার করেছি:

গতিশীল / স্ট্যাটিক টাইপড এক্সপারশন; দৃ strongly় / দুর্বলভাবে টাইপ করা মান।


0

আমি মনে করি, এই সাধারণ উদাহরণটি আপনাকে শক্তিশালী এবং গতিশীল টাইপিংয়ের মধ্যে পার্থক্যগুলি ব্যাখ্যা করতে হবে:

>>> tup = ('1', 1, .1)
>>> for item in tup:
...     type(item)
...
<type 'str'>
<type 'int'>
<type 'float'>
>>>

জাভা:

public static void main(String[] args) {
        int i = 1;
        i = "1"; //will be error
        i = '0.1'; // will be error
    }

আপনার অজগর কোড গতিশীল টাইপিং প্রদর্শন করে যখন জাভা স্থির টাইপিং প্রদর্শন করে। এর চেয়ে ভাল উদাহরণ হ'ল $ var = '2' + 1 // ফলাফলটি 3
এরিকল্ফ

@ আইলিফ আমি রাজি এটির মতো কিছু
লিখতেও

-4
class testme(object):
    ''' A test object '''
    def __init__(self):
        self.y = 0

def f(aTestMe1, aTestMe2):
    return aTestMe1.y + aTestMe2.y




c = testme            #get a variable to the class
c.x = 10              #add an attribute x inital value 10
c.y = 4               #change the default attribute value of y to 4

t = testme()          # declare t to be an instance object of testme
r = testme()          # declare r to be an instance object of testme

t.y = 6               # set t.y to a number
r.y = 7               # set r.y to a number

print(f(r,t))         # call function designed to operate on testme objects

r.y = "I am r.y"      # redefine r.y to be a string

print(f(r,t))         #POW!!!!  not good....

উপরেরগুলি একটি দীর্ঘ সময়ের মধ্যে একটি বৃহত সিস্টেমে অবিস্মরণীয় কোডের একটি দুঃস্বপ্ন তৈরি করবে। আপনি যা চান এটি কল করুন, তবে একটি পরিবর্তনশীল ধরণের "গতিশীল" পরিবর্তন করার ক্ষমতা কেবল একটি খারাপ ধারণা ...

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