টাইপিং.ডিক্ট এবং ডিক সংজ্ঞায়নের মধ্যে পার্থক্য?


101

আমি পাইথন 3.5 তে টাইপ ইঙ্গিতগুলি ব্যবহার করে অনুশীলন করছি। আমার এক সহকর্মী ব্যবহার করে typing.Dict:

import typing


def change_bandwidths(new_bandwidths: typing.Dict,
                      user_id: int,
                      user_name: str) -> bool:
    print(new_bandwidths, user_id, user_name)
    return False


def my_change_bandwidths(new_bandwidths: dict,
                         user_id: int,
                         user_name: str) ->bool:
    print(new_bandwidths, user_id, user_name)
    return True


def main():
    my_id, my_name = 23, "Tiras"
    simple_dict = {"Hello": "Moon"}
    change_bandwidths(simple_dict, my_id, my_name)
    new_dict = {"new": "energy source"}
    my_change_bandwidths(new_dict, my_id, my_name)

if __name__ == "__main__":
    main()

উভয়ই ঠিক কাজ করে, কোনও পার্থক্য বলে মনে হয় না।

আমি typingমডিউল ডকুমেন্টেশন পড়েছি ।

মধ্যে typing.Dictবা dictযা এক আমি প্রোগ্রামে ব্যবহার করা উচিত?


11
নোট করুন পাইথন আসলে টাইপ ইঙ্গিত প্রয়োগ করে না । এগুলি কেবল ইঙ্গিতগুলি , প্রকার প্রয়োগের জন্য এগুলি রানটাইম ব্যবহার করা হয় না, বা সময় সংকলন করা হয় না। পাইথন দৃ strongly়ভাবে টাইপ করা যেতে পারে (দুর্বল টাইপের বিপরীতে), এটিও গতিশীলভাবে টাইপ করা হয় (কঠোর টাইপের বিপরীতে)। দেখুন হল পাইথন শক্তিশালী ভাবে টাইপ? । মাইপির মতো বাহ্যিক সরঞ্জামগুলি আপনাকে আরও ভাল কোড লিখতে সহায়তা করতে এই ইঙ্গিতগুলি ব্যবহার করতে পারে তবে স্থিতিশীল বিশ্লেষণ বলে একটি প্রক্রিয়াতে।
মার্টিজন পিটারস

4
@ মার্তিজনপিটারগুলি আমি মাইপাইয়ের পাশাপাশি আমার কোডে টাইপ ইঙ্গিতগুলি ব্যবহার করতে পছন্দ করতাম এবং ভান করে বলতাম যে আমি পাইথনকে সুরক্ষার সাথে ব্যবহার করতে পারি। দুর্ভাগ্যক্রমে এটি আমার এ) কোড পেয়েছে যা <3.4 এবং বি) লোকেরা আমাকে দেখে হাসছে কারণ স্পষ্টতই, টাইপ ইঙ্গিতগুলি একটি হাসিখোর। এটা সত্যিই বেশ দুর্ভাগ্যজনক।
বিড়াল

4
@ কেট: টাইপ ইঙ্গিতটি পাইথনের সাথে একটি ফেসবুক কর্মচারীর দ্বারা প্রবর্তিত হয়েছিল, কারণ পিএইচপি-তে একই বৈশিষ্ট্য যুক্ত করার ক্ষেত্রে আমরা প্রচুর সাফল্য পেয়েছি ( হ্যাক দেখুন )। যে কেউ হাসছে সে কখনও মুষ্টিমেয় প্রকৌশলী নিয়ে কোনও বড় প্রকল্প তৈরি করে নি।
মার্টিজন পিটারস

4
@ মার্তিজনপিটার্স নং, def a(b: int) -> bool:পাইথন ২.7-তে একটি সিনট্যাক্স ত্রুটি, এবং আমি মনে করি এটি পাইথন 3 এর পুরানো সংস্করণগুলিতেও একটি সিনট্যাক্স ত্রুটি রয়েছে।
বিড়াল

4
@ কেট: আপনি এখানে ফাংশন টীকাগুলির কথা বলছেন , সিনট্যাক্স যা পাইথন 3.0 এ যুক্ত হয়েছিল। সুতরাং একমাত্র সংস্করণ যেখানে সিনট্যাক্স ত্রুটিটি 2.7, তাই মাইপি মন্তব্যগুলিতে সেই তথ্যটি রাখার পক্ষে সমর্থন করে।
মার্টিজন পিটারস

উত্তর:


138

একটি সরল typing.Dictএবং dictনা ব্যবহারের মধ্যে কোনও বাস্তব পার্থক্য নেই।

যাইহোক, typing.Dictএকটি হল জেনেরিক টাইপ আপনি কী ও মান প্রকার দেয় খুব এটি আরো নমনীয় উপার্জন:

def change_bandwidths(new_bandwidths: typing.Dict[str, str],
                      user_id: int,
                      user_name: str) -> bool:

এই হিসাবে, এটি ভাল হতে পারে যে আপনার প্রকল্পের জীবদ্দশায় কোনও এক সময় আপনি অভিধানের যুক্তিটি আরও কিছুটা স্পষ্টভাবে সংজ্ঞায়িত করতে চান, যে বিন্দুতে প্রসারিত typing.Dictকরা typing.Dict[key_type, value_type]বদলের পরিবর্তে 'ছোট' পরিবর্তন dict

আপনি এখানে ব্যবহার করে Mappingবা MutableMappingপ্রকারের মাধ্যমে আরও জেনেরিক তৈরি করতে পারেন ; যেহেতু আপনার ফাংশনটির ম্যাপিংটি পরিবর্তন করার দরকার নেই , তাই আমি আটকে থাকব Mapping। এ dictহ'ল ম্যাপিং, তবে আপনি এমন অন্যান্য বস্তু তৈরি করতে পারেন যা ম্যাপিং ইন্টারফেসটিও পূরণ করে এবং আপনার ফাংশনটি এখনও সেগুলির সাথে ভালভাবে কাজ করতে পারে:

def change_bandwidths(new_bandwidths: typing.Mapping[str, str],
                      user_id: int,
                      user_name: str) -> bool:

এখন আপনি স্পষ্টভাবে এই ফাংশন অন্যান্য ব্যবহারকারীদের যে আপনার কোড আসলে হবে না বলছেন পরিবর্তনnew_bandwidths ম্যাপিং গৃহীত।

আপনার প্রকৃত বাস্তবায়ন কেবল মুদ্রণযোগ্য কোনও বস্তুর প্রত্যাশা করছে। এটি একটি পরীক্ষামূলক বাস্তবায়ন হতে পারে, তবে এটি যেমন দাঁড়ায় আপনার কোডটি আপনি ব্যবহার করলে চলতে থাকবে new_bandwidths: typing.Any, কারণ পাইথনের কোনও বস্তু মুদ্রণযোগ্য।


4
দরকারী অতিরিক্ত উদাহরণগুলি যখন অভিধানের মানগুলি বিভিন্ন ধরণের হতে পারে উদাহরণস্বরূপ {"name": "bob", "age" : 51}, এমন কি কিছু হবে typing.Mapping[Union[str, int]? নেস্টেড ডিকশনারি সম্পর্কে কী {"person": {"name":"bob", "age": 51}এমন কিছু হবে typing.Mapping[str, typing.Mapping[Union[str, int]]? এর Unionমতো ব্যবহার আমাকে কষ্ট দেয় কারণ এটি কোনও কঠোর স্কিমা নয় কারণ কোনও আদেশ নেই। হতে পারে যে ঠিক আছে, বা বিকল্প আছে?
দাভোস

4
Unionপ্রশ্নটি সম্পর্কে মনে রাখবেন না আমি দেখতে পাই এটি এখনও একটি মুক্ত আলোচনা github.com/python/typing/issues/28
দাভোস

4
এটি দেখতে খুব আকর্ষণীয়, দরকারী এবং সম্পর্কিত পাইথন.অর্গ
গ্রেগ

@ গ্রেগহিলস্টন: এটি আসলে অভিধানে কী কী থাকতে পারে তা সীমাবদ্ধ করার বিষয়ে এবং প্রতিটি সম্পর্কিত মানের কী ধরণের থাকতে হবে তা নির্দিষ্ট করে specify
মার্টিজন পিটারস

4
@ গ্রেগহিলস্টন: আহা, হ্যাঁ
মার্টিজন পিটারস

26

typing.Dictএর জেনেরিক সংস্করণ dict:

class typing.Dict(dict, MutableMapping[KT, VT])

ডিকের একটি জেনেরিক সংস্করণ। এই ধরণের ব্যবহার নিম্নরূপ:

def get_position_in_index(word_list: Dict[str, int], word: str) -> int:
     return word_list[word]

এখানে আপনি ডিকটিতে কী এবং মানগুলির ধরণ নির্দিষ্ট করতে পারেন: Dict[str, int]

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