অভিধান বোঝার মধ্যে অনুসন্ধানকার্সারে কার্সার মুছে ফেলা হচ্ছে?


12

যদি মুছে ফেলা হয় তা নিশ্চিত করার জন্য বিবৃতি সহ কার্সারগুলি খোলাই ভাল তবে যেমন:

with arcpy.da.UpdateCursor(fc,fields) as cursor:

তারপরে, যদি কোনও কার্সারটি এরূপ বোঝার ক্ষেত্রে পুনরাবৃত্ত হিসাবে ব্যবহৃত হয়:

d = {k:v for (k,v) in arcpy.da.SearchCursor(fc,fields)}

বোধগম্যতা ব্যবহার করে কার্সারটি মুছে ফেলা কি প্রয়োজনীয়?


1
দুর্দান্ত প্রশ্ন। আপনি কি স্কিমা লকগুলি পরিচালনা করার চেষ্টা করছেন? অনুরূপ বিষয়ে কিছু প্রাথমিক (বেশিরভাগ পুরানো) পোস্ট রয়েছে যদিও আমি নতুন কার্সারগুলিতে কোনও নির্দিষ্ট উত্স খুঁজে পাই না da: sgillies.net/2011/02/01/get-with-it.html এবং help.arcgis.com/ এনআর / আরসিগিসডেস্কটপ / ১০.০ / সহায়তা / সূচিপত্র html # //… । বিশেষত, প্রথম লিঙ্কের নীচে @ জেসনশায়ারারের মন্তব্যগুলি দেখুন।
হারুন

উত্তর:


13

এটি একেবারে প্রয়োজনীয় কিনা তা জিজ্ঞাসা করা ভুল প্রশ্ন। এটি একটি ভাল ধারণা কিনা তা প্রশ্ন।

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

with arcpy.da.UpdateCursor(fc,fields) as cursor:
    d = {k: v for (k,v) in cursor}

আপনি যা সম্পর্কে অবগত নন তা হ'ল এই withধারাটি আসলে অতিরিক্ত যুক্তি সঞ্চার করে। একটি withঅনুচ্ছেদে একটি প্রসঙ্গ পরিচালক প্রয়োজন, যার অবশ্যই একটি __enter__(ব্লক প্রবেশ করার সময় অনুরোধ করা) থাকতে হবে এবং __exit__(ব্লকটি বেরিয়ে যাওয়ার সময় অনুরোধ করা হবে) পদ্ধতি থাকা উচিত। বিশেষত, __exit__কোনও ব্যতিক্রম ঘটেছে কিনা তা বিবেচনা না করেই পদ্ধতিটি আহ্বান জানানো হয়েছে, প্রোগ্রামটি সর্বদা ত্রুটি হলেও রিসোর্সটি প্রকাশ করে তা নিশ্চিত করে। এটি আপনার কোডটি কখন কোনও সংস্থান গ্রহণ করা হবে এবং কখন এটি প্রকাশ করা হবে তার স্পষ্ট ডকুমেন্টেশন দেয় এবং এটি নিশ্চিত করে যে কোনও সংস্থান যত তাড়াতাড়ি সম্ভব প্রকাশ করা যেতে পারে।

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

দীর্ঘমেয়াদী রক্ষণাবেক্ষণও বিবেচনা করুন। সেখানে এটা কোন দীর্ঘ মেয়াদী রেফারেন্স এখন, কিন্তু কি 6 মাসে ঘটে যখন আপনি যাতে কোড পরিবর্তন প্রয়োজন হয় একটি রেফারেন্স? অন্য কেউ যদি তা করে? পরিবর্তনটি করা ব্যক্তি হয়ত কোনও withব্লকে স্যুইচ করার কথা ভাবতে পারে না কারণ সেখানে ইতিমধ্যে একটি নেই। আপনার সংস্থানগুলি পরিষ্কার করার অভ্যাস করুন এবং এটির সাথে আপনার খুব কম সমস্যা হবে।

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

মূল কথাটি হ'ল এটিকে স্পষ্টভাবে প্রকাশ না করা একটি খারাপ ধারণা।

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


3

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

নেমস্পেসে কোনও প্রবেশ নেই এবং তাই কোনও কিছু মুছতে হবে না। ইএসআরআই এখানে এই সিন্টেক্সটি উদাহরণ 2 হিসাবেও বর্ণনা করে ।

আরও স্পষ্ট করতে, যদি আপনি চালান:

>>> import arcpy
>>> f = r'C:\Workspace\study_area.shp'
>>> a = arcpy.da.SearchCursor(f, ['*'])

আপনি ডিরেক্টরিতে একটি লক ফাইল উপস্থিত দেখতে পাবেন (আপনার ফাইল এক্সপ্লোরার চেক করুন)। কার্সারের রেফারেন্সটি হ'ল a, যা মুছে ফেলা cursorনা হওয়া অবধি (এবং তাই লকটি ধরে রাখা) করবে a। সুতরাং যখন আপনি তারপর চালানো:

>>> del(a)

নেমস্পেসের এন্ট্রি সরিয়ে ফেলা হবে এবং লকটি প্রকাশ হবে (। লক ফাইলটি অদৃশ্য হয়ে যাবে)। আপনি যদি চালান:

>>> t = [i for i in arcpy.da.SearchCursor(f, ['*'])]

হয় আপনি কোনও লক ফাইল দেখতে পাবেন না, বা কমান্ডটি শেষ হলে এটি অদৃশ্য হয়ে যাবে। নেমস্পেসে প্রবেশ ছাড়াই cursorস্থির হয় না। tআপনি সুনির্দিষ্ট তালিকা cursorতৈরি করেছেন, এটি তৈরির জন্য ব্যবহৃত নয়।

সংক্ষিপ্ত বিবরণ হিসাবে, cursorsযখন কেবল নেমস্পেসে তাদের রেফারেন্স থাকবে তখনই মুছে ফেলার বিষয়ে আপনার চিন্তার প্রয়োজন (যেমন আপনি যখন তাদের aউপরের উদাহরণের মতো কোনও ভেরিয়েবলের জন্য নিযুক্ত করেছেন )।


2
এটি অত্যন্ত দুর্বল প্রোগ্রামিং অনুশীলন। যদি কোনও কিছুর কাছে রিসোর্সগুলি মুক্ত করার একটি সুস্পষ্ট উপায় থাকে তবে আপনি এটি ব্যবহার করুন
jpmc26

@ jpmc26, কোন অংশটি "অত্যন্ত দুর্বল প্রোগ্রামিং অনুশীলন"? সাধারণভাবে বোধগম্যতা? বা কেবল তখনই যদি বোঝার মধ্যে পুনরাবৃত্তি তাত্ক্ষণিক হয়? আমি ভেবেছিলাম যে পরবর্তীকালের জন্য একটি দৃ .় যুক্তি হ'ল এটি অবিলম্বে সংস্থানটি প্রকাশ করে।
টম

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

2

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

পাইথনে, কার্সারটি প্রকাশ না হওয়া পর্যন্ত লকটি স্থির থাকে। অন্যথায়, অন্যান্য সমস্ত অ্যাপ্লিকেশন বা স্ক্রিপ্টগুলি অকারণে কোনও ডেটাসেট অ্যাক্সেস করা থেকে রোধ করা যেতে পারে। কার্সার নিম্নলিখিতগুলির মধ্যে একটির মাধ্যমে মুক্তি পেতে পারে:

বিবৃতি সহ কার্সারটি অন্তর্ভুক্ত যা কার্সর সফলভাবে সম্পন্ন হয়েছে কিনা তা নির্বিশেষে লকগুলি মুক্তির গ্যারান্টি দিবে;

কার্সারে কলিং রিসেট ();

কার্সারের সমাপ্তি;

পাইথনের ডেল স্টেটমেন্ট - ইএসআরআই ব্যবহার করে স্পষ্টভাবে কার্সার মোছা হচ্ছে

আরকিপি.ডি কার্সার দিয়ে লক করা মূল আরকি কার্সারগুলির সাথে লক করার মতোই।

আপনার কোডটি পরীক্ষা করার পরে এবং জেরার্ড যেমন উল্লেখ করেছেন, বোঝাপড়া শেষ হওয়ার পরে কার্সারের কোনও রেফারেন্স নেই।
এছাড়াও, বোঝাপড়া শেষ হওয়ার পরে বৈশিষ্ট্য শ্রেণিতে কোনও লক নেই।


1
কি মুছে ফেলছে? বোধগম্যতা শেষ হওয়ার পরে কার্সার অবজেক্টের কোনও রেফারেন্স নেই, সুতরাং তাত্ত্বিকভাবে এটি বন্ধ হওয়া উচিত। আপনার প্রত্যাশা মতো ইএসআরআই এর বাস্তবায়ন আচরণ করবে কিনা তা অন্য একটি প্রশ্ন এবং আমি মনে করি না যে ডক্স সত্যই এর জবাব দিয়েছে।
মাইকওয়াট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.