এই অদ্ভুত কোলন আচরণটি কী করছে?


104

আমি পাইথন 3.6.1 ব্যবহার করছি এবং আমি খুব অদ্ভুত কিছু পেয়েছি। আমার কাছে একটি সাধারণ অভিধান অ্যাসাইনমেন্ট টাইপ ছিল যা আমাকে খুঁজে পেতে দীর্ঘ সময় নিয়েছিল।

context = {}
context["a"]: 2
print(context)

আউটপুট

{}

কোড কি context["a"]: 2করছে? SyntaxErrorযখন এটি আইএমও করা উচিত তখন এটি উত্থাপিত হয় না । প্রথমে আমি ভেবেছিলাম এটি একটি স্লাইস তৈরি করছে। তবে, টাইপিং repr(context["a"]: 2)একটি উত্থাপন SyntaxError। আমি কনসোলটিও টাইপ করেছি এবং context["a"]: 2কনসোলটি কিছু প্রিন্ট করে নি। আমি ভেবেছিলাম সম্ভবত এটি ফিরে এসেছে None, তবে আমি এতটা নিশ্চিত নই।

আমি আরও ভেবেছি বিবৃতি দেওয়া হলে এটি একক লাইন হতে পারে তবে এটি সঠিক বাক্য গঠন হওয়া উচিত নয়।

অতিরিক্তভাবে, context["a"]একটি উত্থাপন করা উচিত KeyError

আমি বিভ্রান্ত কি হচ্ছে?


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

1
এটা কি তোমার প্রশ্নের উত্তর? পাইথন ৩.6-এ পরিবর্তনীয় টীকাগুলি কী কী?
জর্জি

উত্তর:


98

আপনি দুর্ঘটনাক্রমে একটি সিনট্যাক্টিক্যালি সঠিক ভেরিয়েবল টিকা লিখেছেন । পাইথন ৩.6-তে এই বৈশিষ্ট্যটি চালু হয়েছিল ( পিইপি 526 দেখুন )।

যদিও একটি পরিবর্তনশীল টীকা একটি অংশ হিসেবে পার্স করা হয় সটীক নিয়োগ , নিয়োগ বিবৃতি হল ঐচ্ছিক :

annotated_assignment_stmt ::=  augtarget ":" expression ["=" expression]

এইভাবে, ইন context["a"]: 2

  • context["a"] টীকা লক্ষ্য
  • 2 টীকাটি নিজেই
  • context["a"] অবিচ্ছিন্ন রেখে দেওয়া হয়েছে

পিইপি বলেছে যে "টীকাগুলির লক্ষ্যটি কোনও বৈধ একক অ্যাসাইনমেন্ট লক্ষ্য হতে পারে, কমপক্ষে সিন্ট্যাক্টিকভাবে (এটি কী প্রকারের যাচাইকারী তা করতে পারে)" , যার অর্থ কীটি থাকার দরকার নেই that টীকাগুলি (অতএব না KeyError)। মূল পিইপি থেকে একটি উদাহরণ এখানে:

d = {}
d['a']: int = 0  # Annotates d['a'] with int.
d['b']: int      # Annotates d['b'] with int.

সাধারণত, টীকাগুলির এক্সপ্রেশনটির একটি পাইথন প্রকারের মূল্যায়ন করা উচিত - টীকাগুলির সমস্ত মূল ব্যবহার টাইপ হিন্টিংয়ের পরে, তবে এটি প্রয়োগ করা হয় না। ফলাফলের ধরন বা মান নির্বিশেষে টীকাটি কোনও বৈধ পাইথন এক্সপ্রেশন হতে পারে।

যেমন আপনি দেখতে পাচ্ছেন, এই মুহুর্তে টাইপ করার ইঙ্গিতগুলি খুব অনুমতিপ্রাপ্ত এবং খুব কমই কার্যকর, যদি না আপনি মাইপির মতো স্ট্যাটিক ধরণের পরীক্ষক হন ।


12
এর জন্য =তখন কি এসাইনমেন্ট অপারেটরের প্রয়োজন হবে না ? কীটির অস্তিত্ব নেই। এটি আমার কাছে কেবল ভুল মনে হচ্ছে।
জাস্টেনজেল

1
এই ক্ষেত্রে, : হয় অ্যাসাইনমেন্ট অপারেটর। আমরা কেবল কোনও ধরণের টীকাটি "অর্পণ" করছি, কোনও কী নেই। আমি সন্দেহ করি এটির অনুমতি দেওয়ার কোনও কারণ আছে, কেবল একটি অনিচ্ছাকৃত পক্ষই টীকাটি সিনট্যাক্স যুক্ত করার প্রভাব ফেলে।
চ্যানার

1
@ চেপনার মনে হয় এটি কোনও পার্শ্ব-প্রতিক্রিয়া নয় ho সংশ্লিষ্ট পিইপি ঠিক এটিই করার জন্য ডিজাইন করা হয়েছিল।
01

6
এটি অদ্ভুত যে এটি আপনাকে এমন কোনও লক্ষ্য নির্ধারণের অনুমতি দেবে যা এখনও নির্ধারণ করা হয়নি। আমার প্রথম লাইনটি যদি x: strঅবিলম্বে হয় এবং তত্ক্ষণাত্ type(x), দোভাষীটি একটি উত্থাপন করে NameError। আইএমও সিনট্যাক্সটি প্রয়োগ করা উচিত অবজেক্টটি পূর্বনির্ধারিত, বা স্পটটিতে সংজ্ঞায়িত। এটি কেবল বিভ্রান্তির পরিচয় দেয়।
r.ook

2
@ আইডিয়হ্যান্ডস যদিও এটি উদ্দেশ্যকে পরাস্ত করে। পরের ধরণের অপ্রয়োজনীয় তৈরি করার x = 'i am a string'পূর্বে x: str.. এটি মোটেও যুক্ত করা উচিত ছিল না। মন্তব্য হিসাবে ঠিক ছিল; আমি কখনই এটি একরকম বা অন্যভাবে ব্যবহৃত দেখায় না।
Ma0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.