Daha çox

ArcPy / Python skriptinin axtarış kursorunda səhv nəticələr əldə edirsiniz?


İki funksiyam var:

  1. Əvvəlcə xüsusiyyət qatını qablaşdıracaqsınız
  2. ikincisi eyni yaradılan təbəqəyə daxil olacaq və nəticəni yazdıracaq.

skriptimi ilk dəfə çalıştırdığımda səhv nəticələri yazdıracaq. ikinci dəfə çalıştırdığımda düzgün nəticəni yazdıracaq ...

1-ci dəfə işləyən səhv nəticə skripti:

xəritə qatı 2-yə giriş əldə etmək

(dəfələrlə təkrarlandı)

.

Düzgün nəticə: İkinci dəfə işləyən skript 1. yaradan təbəqə yalnız 5 satırdan ibarətdir, beləliklə skriptim yalnız 5 mesaj çap edir

xəritə qatına giriş əldə etmək

bütün təbəqələr üçün təkrarlanır.

Ssenari:

# idxal sistem modulları arcpy idxal riyaziyyat idxal sys arcpy idxal env traceback idxal # Bölgələrin Sərhədini Qurmaq Sınıfı Build_Boundry: def __init __ (self, workSpace, mapLayerFinal, censusLayer, totalDistrict, mxdLocation): self.workSpace = workSpace selfc. = censusLayer self.mapLayerFinal = mapLayerFinal self.totalDistrict = totalDistrict self.mxdLocation = mxdLocation # Hər bir rayon def hüdudundakı ümumi seçicilərin orta hesablanması funksiyası (self): arcpy.AddMessage ("Bölgələrin Bina Sərhədləri") əgər arcpyE self.mapLayerFinal): arcpy.AddMessage ("Qat Artıq Mövcuddur ...") çap (self.mapLayerFinal) başqa: arcpy.MakeFeatureLayer_management (self.censusLayer, self.mapLayerFinal, "DISTRICT_ID BETWEEN 1 AND") self.workSpace) # LANDUSE və TAXCODE istifadə edərək Dissolve Fields arcpy.Dissolve_management (self.mapLayerFinal, str (self.workSpace) + "/" + str (self.mapLayerFinal), "DISTRICT_ID", "", "MULT , "DISSOLVE_LINES") səh rint (self.mapLayerFinal) arcpy.AddMessage ("Hesablanan Bölgələrin Sərhəddi") mxd = arcpy.mapping.MapDocument (self.mxdLocation) df = arcpy.mapping.ListDataFrames (mxd, "") [0] addLayer = arcpy.mapping .Layer (self.mapLayerFinal) arcpy.mapping.AddLayer (df, addLayer, "BOTTOM") mxd.save () arcpy.RefreshTOC () del mxd, addLayer qayıt; Kompaktlığı hesablamaq üçün # Sınıf Calculate_Compactness sinfi: def __init __ (self, workSpace, mapLayerFinal): self.workSpace = workSpace self.mapLayerFinal = mapLayerFinal # Compact hesablamaq üçün funksiya def compactness_quotient (self): arcpy.AddMessage ilə "" hesablama arcpy.da.SearchCursor (self.mapLayerFinal, ["Shape_Area", "DISTRICT_ID", "Shape_Length"]) satır kimi: satır sırası üçün "layer" + str (self.mapLayerFinal) yazdırın: area = row [0] district_id = sıra [1] ətraf = satır [2] çap "xəritə qatına giriş əldə etmək" + str (rayon_id) çap "Kompaktlığın hesablanması prosesi tamamlandı" qayıt; qovluq = "C: / Users / Abrar ahmad / Desktop / CASES / Rural / Case_1_Boundary_Input" mxdLocation = r "C: / Users / Abrar ahmad / Desktop / CASES / Rural / Case_1_Boundary_Input / New_Rwp_Cencus.mxd" workSpace = "C: / Abrar ahmad / Desktop / CASES / Kırsal / Case_1_Boundary_Input / Selected_BU2.gdb "env.workspace = workSpace censusLayer =" Rural_Area_Rwp "RayonlarıLayer =" Mövcud_District_Boundary "totalDistrict = int (5) mapLay) Build Boundry border = Build_Boundry (workSpace, mapLayerFinal, censusLayer, totalDistrict, mxdLocation) limit.boundry () cc = Calculate_Compactness (workSpace, mapLayerFinal) cc.compactness_quotient ()

MakeFeatureLayer və Dissolve_Management-də toqquşan bir dəyişən var. onu dəyişdirdi temp_layer

arcpy.MakeFeatureLayer_management (self.censusLayer, "tmp_Layer", "DISTRICT_ID ARASINDA 1 AND" + str (self.totalDistrict), self.workSpace) # LANDUSE və TAXCODE istifadə edərək Dissolve Fields aralığında istifadə edin (" self.workSpace) + "/" + str (self.mapLayerFinal), "DISTRICT_ID", "", "MULTI_PART", "DISSOLVE_LINES")

Qlobal koordinatlar və məsafəni hesablayın.

Əvvəlcə mesh koordinatları yerli və səhnə imlecinin yeri qlobaldır. Ya səhnə imlecini lokal olaraq çevirin

və sonra boşu əlavə edərkən nəticə qlobal vəziyyətə qayıdır.

Bunun üçün yalnız 2 matris çarpması lazımdır.

və ya mesh koordinatlarını qlobala çevirin (aşağıda bunu etdiniz)

bmesh'a geri yazmadığımız üçün qalıcı olaraq əks olunmayacaq.

Xəttin ən yaxın nöqtəsi nədir.

Xəttə nöqtəyə ən yaxın nöqtəni qaytarır və bunun başlanğıc nöqtəsindən neçə faiz olduğunu tapır yəni 0 başlanğıc nöqtəsi, 1 digər uc. Xəttin xaricinə çıxmır.

Yuxarıdakı nümunədə bildirişin hər ikisi eyni nəticəyə malikdir, halbuki biri xəttin ortasında, digəri yox. Sual şəklində də aydın olur, nəticə künc aka kənar vert arasındakı ən az nisbətdir. Normalları çevirsəniz, vertex sırasını dəyişdirəcəksiniz, əgər küncdən 10% olarsa (olduğu kimi) vertlərin yaralanması ilə 90% yol olacaq başqa yolla.

Bunun əvəzinə vuruşu imlecin yerindən çıxaraq məsafəni hesablayın.

Yalnız sıfır üzün deyil, bütün kənarların yaxın nöqtələrində boş əlavə etmək üçün kodu dəyişdirdiniz.

Min / max üçün digər konstruksiyalar

Hər təkrarlama zamanı maksimum və test kimi super yüksək bir dəyər təyin etmək əvəzinə, minimum və maksimumu tapmağın başqa yolları da var (numpy bu işdə son dərəcə yaxşıdır)

Başqa bir şey, bütün hitləri bir siyahıdan anlamaq və onları sıralamaqdır. Sıfır ən yaxın, sonuncusu ən uzaq olacaq.


ArcPy və Python kodlaşdırır?

ArcPy və Python kodlaması arasında qəribə bir davranışla qarşılaşdım. VS (PTVS) quraşdırılmış Python alətləri ilə VisualStudio 2010 Shell ilə işləyirəm. Problemimi sadə bir skript faylı vasitəsilə təcrid etdim. Aşağıdakı əmrləri ehtiva edən py script faylı. VisualStudio-da «Qabaqcıl Saxlama Seçimlərini təyin etdim. »-Dən« imzasız UTF-8-ə ». Skript sadəcə vurğulu bir simli ekranda yazdırır, sonra arcpy modulunu idxal edir, sonra yenidən eyni simli çap edir. Arcpy-nin idxalı Python kodlama quruluşunu dəyişmiş kimi görünür, amma niyə olduğunu bilmirəm və orijinal ssenaridə hər yerdə bir az problem yaratdığından düzgün şəkildə yenidən qurmaq istərdim.

Python «kodlaşdırma» qovluğunu yoxladım və hər pyc sənədini sildim. Ssenarini işlədəndən sonra 3 pyc faylı yaratdı:

  1. cp850.pyc (mənim stdout.encoding-ə uyğun gəlir)
  2. cp1252.pyc (Windows mühit kodlaşdırmama uyğun gəlir)
  3. utf_8.pyc (skriptimin kodlaşdırmasına uyğun olan)

ArcPy idxal edildikdə, başlanğıc dəyişənləri təsir edən kodlamanı dəyişdirən bir şey gəlir.

Bəzi Python əmri ilə ArcPy kodunun cp1252 kodunun harada olduğunu tapmaq və onunla işləyən bir funksiya qura biləcəyimi oxumaq mümkündürmü?

və ssenarini çalıştırdığımda bu nəticələri alıram:

Yüklənmiş kodlaşdırma: ascii
Kodlaşdırma qurun: utf-8

Orijinal növü: 'unicode' növü
Orijinal mətn: Récuperation des données & lt --- Bu doğru

arcpy idxal edin
Yüklənmiş kodlaşdırma: utf-8

arcpy mess up orijinal növü: type 'unicode'
arcpy mess up orijinal mətn: R'cuperation des donn'es> & lt --- Bu səhvdir
arcpy cp1252 növü ilə ReEncode qarışıqlığı: type 'str'
arcpy cp1252 mətni ilə ReEncode mess: Récuperation des données> & lt --- Bu orijinal unikoda uyğundur


Mövcud kontekst üzvləri hazırda əldə edilən qarışdırıcı sahədən asılıdır.

Bir çox operator siçanın etibarlı bir sahə olduğunu və ya obyektin düzgün rejimdə olduğunu yoxlaya bilən "anket" funksiyasına malikdir (Düzəliş rejimi, Ağırlıq Boyası və s.). Bir operatorun anket funksiyası python daxilində uğursuz olduqda, bir istisna qaldırılır.

Operatorların istifadəsi və anketdə uğursuzluqla qarşılaşmağınız barədə daha çox məlumat (siçan sağ ekran sahəsi və ya səhv rejim / digər şərt). Bununla əlaqədar API sənədlərinin Gotchas hissəsinə də baxın.

  1. Blender 2.7x-də boşluq çubuğu menyusundan (bölmənin altına baxın) və ya uyğun ərazidən Blender 2.8x-dən etibarən F3 istifadə edərək bir operatoru işə salın (bl_options 'INTERNAL' olmamalıdır)
  2. Sağını göstərin icra konteksti operator çağırışı üçün (bu kontekst səhvini düzəldir yalnız bəziləri üçün!)
    (API sənədləri, nümunə)
  3. Lazımi kontekst arqumentlərini ötürmək üçün ləğv et istifadə edin
  4. Bölgəni müvəqqəti olaraq dəyişdirin
  5. Kontekst narahatlığı olmadan eyni nəticəni əldə etmək üçün "aşağı səviyyəli" API funksiyalarından istifadə edin

Yoxlamaq

Deyəsən bu operator üçün işləmir ?! Arxa plan əlavə edir, ancaq adı / toxuması olmadan.

Yeri gəlmişkən:
Ümumiyyətlə sistem konsoluna itkin kontekst üzvlərinə dair xəbərdarlıqları yazan boş bir dikt (bpy.ops.example.operator (<>) kimi) keçə bilərsiniz. Bu üzvləri keçib daha çox şikayət etməyincə təkrarlamalısınız. Ancaq səhnə bazaları tələb edən müəyyən operatorlardan ehtiyatlanın - əgər onlara bir istinad verməsəniz, Blender, ehtiyac duyduğunuzdan əvvəl masaüstünə çökəcək.

Bölgəni dəyişdirin.növü

Aşağı səviyyə

Yeniləməyə bənzər şəkildə, bir 3D Görünüş nümunəsinə ehtiyacınız var, bu halda onun boşluq məlumatları (çünki bu, arxa planların yerləşdiyi yerdir). Aşağıdakı kod cari ekranın ilk 3D görünüşünü alır (varsa), yeni bir arxa plan əlavə edir və görüntüyü bir məlumat bazasına yerləşdirir:


3 Cavablar 3

Düşünürəm ki, bu cavabların hamısı a) yol çox mürəkkəbdir və b) user2023861-in nəyi yerinə yetirmək istədiyinə nisbətən yoldan kənar olur:

"Bir dəyişən elan etməyə çalışıram, sonra bu dəyişəni seçin." ya PL / SQL-də, ya da SQLplus-da iki fərqli şey və DBArtisan-da bəlkə də iki şey deməkdir. SQLplus-da məqsədə çatmaq üçün "Əvəzedici dəyişənləri" istifadə edin. əla fon burada tapılmışdır.

Misalım, SQL Server T-SQL nümunənizi dəqiq bir şəkildə təqib etmir, lakin yaxın və prosedur deyil (oxuyun: anonim PL / SQL bloku yoxdur).

Əvəzetmə dəyişənləri olan PL / SQL:

Hər şey SQL-Plus isteminde. qondarma işçilər cədvəlimdən bu nəticəni aldım:

Əgər bu yarı proseduru etmək istəyirsinizsə, BIND Dəyişənlərindən və T-SQL-ə bənzər PL / SQL-in bəyannamə sintaksisindən istifadə edirsiniz. (Mənim fikrimcə bu çox böyük bir səy israfıdır, lakin dəyişən növlərin aydınlaşdırılmasına kömək etmək üçün daxil edilmişdir.)

PL / SQL Bind dəyişənlərindən istifadə edən SQLPlus:

PL / SQL istifadə edərək tam prosedur yanaşma:

Yaxşı, hər işi nə zaman istifadə edirəm? Girişi parametrləşdirmək istədiyim SQL skriptlərini yazdığım zaman SQLplus Əvəzedicilərindən 75% istifadə edirəm. SQLplus təklifində bir skriptin icrası, daxil olan mübahisələrin ötürülməsinə imkan verir, buna görə də ən çox sevdiyim Əvəzedici dəyişənlər aşağıdakı nümunədəki kimi & amp1 və & amp2:

və oxşar SQL kodunu icra edir

Gələn arqumentlərin əvəzedici dəyişənlərə necə təyin olunduğuna, sonra SQL bəyanatında necə istifadə olunduğuna diqqət yetirin. Heç vaxt orta misaldan istifadə etmirəm və həmişə 3-cü nümunələrdən (prosessual PL / SQL) funksiyalar, prosessorlar və paketlər yazarkən istifadə edirəm.


ArcPy / Python skriptinin axtarış kursorunda səhv nəticələr əldə edirsiniz? - Coğrafi İnformasiya Sistemləri

Bu Python versiyası 3.11.0 alfa 0

Müəllif hüquqları (c) 2001-2021 Python Software Foundation. Bütün hüquqlar qorunur.

Müəllif hüququ və lisenziya məlumatları üçün bu sənədin sonuna baxın.

  • Veb səhifə: https://www.python.org
  • Mənbə kodu: https://github.com/python/cpython
  • Sayı izləyicisi: https://bugs.python.org
  • Sənədləşmə: https://docs.python.org
  • Geliştirici Kılavuzu: https://devguide.python.org/

CPython inkişafına töhfə vermək barədə daha dolğun təlimatlar üçün Geliştirici Təlimatına baxın.

Qurula bilən Python dəstləri və Python istifadəsi haqqında məlumatlar, python.org saytında mövcuddur.

Unix, Linux, BSD, macOS və Cygwin-də:

Bu Python'u python3 olaraq quracaq.

Daha çox məlumat əldə etmək üçün skript işləmə konfiqurasiyasına bir çox seçim ötürə bilərsiniz ./configure --help. MacOS hərflərə həssas olmayan fayl sistemlərində və Cygwin-də, icra edilə bilən python.exe adlanır, başqa yerlərdə sadəcə python'dur.

Tam bir Python quraşdırılması qurmaq, platformanızdan və konfiqurasiya seçimlərinizdən asılı olaraq müxtəlif əlavə üçüncü tərəf kitabxanalarının istifadəsini tələb edir. Bütün standart kitabxana modulları bütün platformalarda qurula və ya istifadə edilə bilməz. Müxtəlif Linux dağıtımları və macOS-lar üçün asılılıqlar barədə hazırkı ətraflı məlumat üçün Geliştirici Kılavuzunun Quraşdırma asılılıqları bölməsinə baxın.

MacOS-da, macOS çərçivəsi və universal quruluşlarla əlaqəli əlavə konfiqurasiya və qurma variantları mövcuddur. Mac / README.rst saytına baxın.

İstəsəniz, bir alt direktoriya yarada və oradan konfiqurasiya çağıra bilərsiniz. Misal üçün:

(Bu, uğursuz olacaq həmçinin üst səviyyə qovluğunda qurulmuşdur. Əvvəlcə ən üst səviyyədə bir təmizləmə etməlisiniz.)

Optimize edilmiş bir Python quruluşu əldə etmək üçün çalıştırmadan --enable-optimallaşdırmalarını konfiqurasiya edin. Bu, Profil Təminatlı Optimizasiyanı (PGO) aktivləşdirmək üçün varsayılan hədəfləri müəyyənləşdirir və bəzi platformalarda Link Zamanı Optimizasiyasını (LTO) avtomatik aktivləşdirmək üçün istifadə edilə bilər. Daha ətraflı məlumat üçün aşağıdakı bölmələrə baxın.

PGO, GCC və ya Clang kompilyatorlarının son versiyalarından faydalanır. İstər konfiqurasiya --enable-optimallaşdırma yolu ilə, istərsə də konfiqurasiya bayraqlarından asılı olmayaraq profilli seçim etmək üçün əl ilə işləyərək istifadə olunarsa, optimize qurma prosesi aşağıdakı addımları yerinə yetirəcəkdir:

Bütün Python kataloqu əvvəlki tərtib nəticəsində yarana biləcək müvəqqəti sənədlərdən təmizlənir.

Hər bir ləzzət üçün uyğun tərtibçi bayraqlarından istifadə edərək tərcüməçinin alətli bir versiyası hazırlanır. Qeyd edək ki, bu, sadəcə bir vasitəçi addımdır. Bu addımdan yaranan ikili, içəridə yerləşdirilmiş profilləşdirmə təlimatına sahib olduğu üçün real həyat yükləri üçün yaxşı deyil.

Cihazlı tərcüməçi qurulduqdan sonra, Makefile bir təlim yükü çalışdıracaq. Bu, tərcüməçinin icrasının profilini müəyyənləşdirmək üçün lazımdır. Həm də bu addımda görünə biləcək hər hansı bir stdout və stderr çıxışının yatırıldığını da unutmayın.

Son addım, alətdən toplanan məlumatları istifadə edərək, faktiki tərcüməçi qurmaqdır. Son nəticə paylama və ya istehsalın quraşdırılması üçün uyğunlaşdırılan Python ikili olacaqdır.

Configure - lto bayrağı ilə effektivdir. LTO, son icraedicilər və ya əlavə performans qazancları üçün paylaşılan kitabxanalar qurarkən, başqa bir təsadüfi .o fayl sərhədləri boyunca optimallaşdırma qabiliyyətindən istifadə edir.

Python 3.10 sənədində Yeniliklər sənədində dəyişikliklərə dair hərtərəfli bir baxış var. Daha ətraflı dəyişiklik jurnalına baxmaq üçün Misc / NEWS-ə baxın, lakin dəyişikliklərin tam uçotu yalnız öhdəlik tarixindən götürülə bilər.

Python'un birdən çox versiyasını yükləmək istəyirsinizsə, aşağıdakı "Çox versiyanın quraşdırılması" başlıqlı bölməyə baxın.

Daha sürətli giriş üçün bir çox formatda yükləyə bilərsiniz. Sənədlər HTML, PDF və reStructuredText formatlarında yüklənə bilər və sonuncu versiya əsasən sənədləşmə müəllifləri, tərcüməçilər və xüsusi formatlama tələbləri olan insanlar üçündür.

Python sənədlərinin hazırlanması barədə məlumat üçün Doc / README.rst-ə müraciət edin.

Python 3.0-ın buraxılması üçün Python 3 üçün yazılmış proqramların Python 3 ilə işləyərkən sıradan çıxmasına səbəb ola biləcək geriyə uyğun olmayan uyğunsuz dəyişikliklər edildi, kodunuzu Python 2-dən Python 3-ə köçürmək barədə daha çox məlumat üçün NÜMUNƏ TƏMİNİNƏ baxın.

Tərcüməçini sınamaq üçün ən üst səviyyə qovluğuna make test yazın. Test dəsti bir qədər nəticə verir. İdxal edilə bilməyən isteğe bağlı xüsusiyyətlərə görə atlanan testlər barədə mesajları ümumiyyətlə laqeyd edə bilərsiniz. Uğursuz bir test haqqında bir mesaj yazılırsa və ya bir izləmə və ya əsas zibil istehsal olunursa, bir şey səhvdir.

Varsayılan olaraq, testlərin disk sahəsi və yaddaş kimi mənbələrdən həddindən artıq istifadəsinin qarşısı alınır. Bu testləri təmin etmək üçün make testall-ı çalıştırın.

Hər hansı bir test uğursuz olarsa, uğursuz test (lər) i açıq rejimdə yenidən işə sala bilərsiniz. Məsələn, test_os və test_gdb uğursuz olduqda, çalıştırabilirsiniz:

Uğursuzluq davam edərsə və mühitinizdən çox Python ilə problem kimi görünsə, bir səhv hesabatı yaza və problemi göstərmək üçün həmin əmrdən müvafiq çıxışı daxil edə bilərsiniz.

Çalışan testlər haqqında daha çox məlumat üçün Running & amp Yazı Testlərinə baxın.

Unix və Mac sistemlərində eyni quraşdırma prefiksindən istifadə edərək bir çox Python versiyasını quraşdırmaq istəyirsinizsə (- konfiqurasiya ssenarisinə prefiks arqumenti), əsas python çalıştırıcınızın fərqli bir versiyanın quraşdırılması ilə yazılmamasına diqqət yetirməlisiniz. Altinstall istifadə edərək quraşdırılmış bütün fayllar və qovluqlar böyük və kiçik versiyaları ehtiva edir və beləliklə yan-yana yaşayır. make install də $ yaradır/ bin / python3, $ -ə aiddir/bin/pythonX.Y. Eyni prefiksdən istifadə edərək birdən çox versiyanı quraşdırmaq istəyirsinizsə, hansı versiyanın (varsa) "əsas" versiyanız olduğuna qərar verməlisiniz. Make install istifadə edərək həmin versiyanı quraşdırın. Make altinstall istifadə edərək bütün digər versiyaları quraşdırın.

Məsələn, 3.10 əsas versiyası olan Python 2.7, 3.6 və 3.10-u yükləmək istəyirsinizsə, 3.10 build qovluğunda make install-i icra edib başqalarında altinstall etməlisiniz.

Hata hesabatları xoş gəlmisiniz! Xətaları bildirmək və / və ya GitHub-da çəkmə istəklərini göndərmək üçün məsələ izləyicisindən istifadə edə bilərsiniz.

Python-dev poçt siyahısında inkişaf müzakirəsini də izləyə bilərsiniz.

Python'u dəyişdirmək təklifiniz varsa, ilkin rəy üçün comp.lang.python və ya python-ideas poçt siyahılarına bir e-poçt göndərmək istəyə bilərsiniz. Fikriniz əsas qazanarsa, Python Gücləndirilməsi Təklifi (PEP) təqdim edilə bilər. Bütün mövcud PEP-lər və yeni bir PEP təqdim etmək üçün təlimatlar python.org/dev/peps/ saytında verilmişdir.

Python 3.10 buraxılış məlumatları üçün PEP 619-a baxın.

Müəllif hüquqları (c) 2001-2021 Python Software Foundation. Bütün hüquqlar qorunur.

Müəllif hüquqları (c) 2000 BeOpen.com. Bütün hüquqlar qorunur.

Müəllif hüquqları (c) 1995-2001 Milli Tədqiqat Təşəbbüsləri Korporasiyası. Bütün hüquqlar qorunur.

Müəllif hüquqları (c) 1991-1995 Stichting Mathematisch Centrum. Bütün hüquqlar qorunur.

Bu proqramın tarixi, istifadəsi üçün şərtlər və amp şərtləri və BÜTÜN ZƏMANƏTLƏRİN RİSKETORU haqqında məlumat üçün LİSENZİYA-ya baxın.

Bu Python paylanması ehtiva edir yox GNU General Public License (GPL) kodu, buna görə mülkiyyət layihələrində istifadə edilə bilər. Bəzi GNU kodlarının interfeysləri var, lakin bunlar tamamilə isteğe bağlıdır.

Burada istinad olunan bütün ticarət nişanları müvafiq sahiblərinin mülkiyyətidir.


Üst səviyyəli qısayol menyuları

Cari Sessiya qısayol menyusu

Mövcud Sessiya siyahısındakı bütün nəticələri silir. Nəticələr tərəfindən göstərilən bütün çıxış məlumatları, hər hansı bir giriş xüsusiyyəti və ya qeyd dəsti (interaktiv xüsusiyyət və ya sıra girişi istifadə edərək yaradılan məlumatlar) silinəcəkdir. Hamısını Sil'i seçsəniz, bütün çıxış məlumatlarını silmək istədiyinizə əmin olub olmadığınızı soruşan bir mesaj qutusu açılacaqdır.

Bütün nəticə məlumatlarını siyahıdan silir. Çıxış məlumatları silinmir.

Əvvəlki sessiyaların qısayol menyusu

Bütün nəticələri əvvəlki iclas siyahısından silər. Çıxış məlumatları silinməyəcək.

Qısa menyu işləmir

Alətlər işləyərkən və ya gözlədikdə bir xəritə sənədindən çıxsanız və saxlasanız, bütün işləyən və gözləyən alətlər Nəticənin altında işlədiləcək.

Bütün nəticələri İşlənməyənlər siyahısından silər. Çıxış məlumatları silinməyəcək.

Bütün alətləri icra edir. Nəticələr Çalışmır'dan silinir və Cari Sessiyaya əlavə olunur.

Paylaşıldı

Paylaşılan qovşaq üçün qısayol menyusu yoxdur.


MySQL-PostgreSQL köçəri skript

MySQL verilənlər bazasını fərqli bir sxemlə (fərqli cədvəl strukturları, fərqli məlumat növləri və s.) Bir PostgreSQL verilənlər bazasına köçürmək üçün Python skriptinin üzərində işləyirəm.

Mən sysadminəm və təəssüf ki, çox vaxt kod vermirəm. Beləliklə, bu başlanğıc proqramlaşdırma mərhələsində şübhələrim var.

Köçürülməsi asan olan cədvəllərdən başlayıram (demək olar ki, eyni quruluş), amma çox keçmədən daha çox əməliyyata ehtiyacı olan cədvəlləri uyğunluq üçün çevirmək məcburiyyətində qalacağam.

Kodum əslində belə görünür:

Gördüyünüz kimi, ssenarinin hər hissəsində struktur demək olar ki, eynidır:

  • Mənbə verilənlər bazasının bir cədvəlindən məlumatları seçin (mysql), nəticə lüğət bayrağı ilə bir imlec tərəfindən idarə olunur (python lüğəti).
  • Bundan sonra lüğət mümkün olduğu bir for loop daxilində təkrarlanır, məs. sahələri tökmə və ya masa quruluşunu uyğunlaşdırmaq (bölməyə baxın: A2.right> A3.permission).
  • Və yenə də for loop daxilində hər bir qeyd təyinat bazasına daxil edilir.

Suallar / Şübhələr:

Artıq kodu mücərrəd etmək üçün bir sinif yaratmalıyam? Və ya bəlkə yalnız bir funksiya yaratmaq daha yaxşıdır? Kimsə qısa bir nümunə göndərə bilərmi? Necə davam edəcəyim barədə bir fikrim yoxdur.
Hər iki halda da abstrakt məsələsində bəzi problemlər görürəm, çünki lazımsız kod bir döngənin içərisindədir, hansı cədvəldə təkrarladığımdan asılı olaraq müxtəlif əməliyyatlar etməli olacağam.

Hər bir əməliyyatda (skript bölməsi) imlecləri açıb-bağlayırdım, sonra hər iki imleci ssenarinin əvvəlində açmağa və sonuna qədər istifadə edib bağlamağa qərar verdim. Ancaq indi bunu oxudum və qarışıq qaldım. Fikrinizcə daha yaxşı nə var? Hər əməliyyat üçün bir kursor, yoxsa bütün skript üçün bir kursor?


4 Cavablar 4

Buna oxşar bir şey üçün yasnippet adlı paketdən istifadə edirəm. Bəzi kiçik dəyişikliklərdən sonra Google Docstring stilini istifadə etmək üçün uyğunlaşdırdım:

Ancaq biraz quraşdırma tələb etdiyinə diqqət yetirin:

Parçanın özü mətn yaratmaq üçün bəzi yardım proqramını yerinə yetirməlidir. Bu, ümumiyyətlə python rejimi snippet qovluğunun içərisindəki kod ilə .yas-setup.el adlı bir fayl yaratmaqla həll olunur. Bununla birlikdə kodu əvəzinə .emacs içərisinə yerləşdirmək də mümkündür.

Parçanın kodu:

.Yas-setup.el kodu:

Python-split-args tərəfindən təmin edildiyini unutmayın standart fraqmentlər. Yəni: https://github.com/AndreaCrotti/yasnippet-snippets/tree/master Bununla birlikdə paketi pack.el vasitəsilə yüklədiyiniz zaman bunları varsayılan olaraq alırsınız.

Hər şeyin düzgün qurulması ilə parçanı genişləndirmək üçün "defg", ardından Tab yazmağı bacarmalısınız (Misal üçün şəkilə baxın).

Bunun iç içə girintinin, məsələn siniflər daxilində və ya iç içə funksiyalar kimi istifadə edilməsində bir problem var. Bu hallarda dokstring səhvən nədənsə əlavə vaxt girintisidir. Bunu düzəldə bilsəm bu yazını yeniləyəcəm.

Parça, yasnippet-in ikinci genişlənmənin avtomatik girilməsini qadağan edərək digər sahələr daxilində işləməlidir.


9 Cavablar 9

Kodunuzu profilləşdirmədən ağlıma gələn bir neçə fikir:

  1. Bir nüsxədən qaçmaq üçün std :: string -ə istinad kimi keçməyə çalışın (std :: string tətbiqetmənin Yazılanın Kopyalanmaması halında).
  2. Ehtiyat çağıraraq std :: string-də yer ayırın.
  3. Std :: string :: length-un ardıcıl çağırılmasından çəkinin, dəyəri əzbərləyin.
  4. Sətri təkrarən indeksləşdirməkdən çəkinin, əvəzinə təkrarlayıcı istifadə edin.

Dəyərinə görə bu funksiyanı həyata keçirməyin fərqli (daha funksional) bir yolunu sınaya bilərsiniz. Bəziləri bunu deyimsiz hesab edə bilər, bəziləri oxumaqda daha çətindir. Zənginiz - bəlkə də əylənmək üçün necə həyata keçirildiyini görmək üçün (optimallaşdırmağı aktivləşdirməyi unutmayın!):

+ = edərkən ayırmalardan qaçmaq.

Bu kodu sınaya bilərsən, amma bunun daha sürətli olacağına şübhə edirəm:

İn parametrinin artıq istinadla ötürüldüyünə diqqət yetirin. Mümkün olanlardan biri, ehtimal ki, inkişafın, müəyyən bir alfanın alfa olduğunu saxlayan 256 bool axtarış cədvəli yaratmaq olar:

LUT bu kod hər çağırıldıqda doldurulur, əgər sətir> 20.000 olarsa bu dəfə əhəmiyyətsiz olmalıdır.

Yaddaş ayıran və son sətir ölçüsünü yalnız bir dəfə dəyişdirən C ++ 11 kodunu izləyə bilərsiniz

Budur, nəzərdən keçirməyə dəyər ola biləcək başqa bir ehtimalı göstərən başqa bir göstərici:

Ən azı testimdə həm VC ++ (10), həm də g ++ (4.7.0) ilə std :: vektor simdən daha sürətli çıxır.

Özümüzün masaya əsaslanan isalpha versiyasını istifadə etmək :: isalpha ilə müqayisədə sürətə bir az kömək edir, lakin std :: vector istifadə etmək sürəti daha da artırır, xüsusən də VC ++ ilə (fərq olsa da kifayət qədər g ++ ilə də əhəmiyyətli).

Kompilyatorları müqayisə etmək istəyənlər üçün g ++ -nin ümumilikdə daha sürətli deyil, həm də daha davamlı olduğunu qeyd etmək lazımdır. G ++ ilə, ən pis hal ən sürətli olduğundan təxminən iki dəfə daha yavaş olur. VC ++ ilə ən pis hal təxminən üç dəfə daha yavaşdır.

C dilindən istifadə edin. Bəzi bölgələrdə, isalpha və dostlar çox ləng ola bilər.

və ya C lokalını koddan aktivləşdirmək üçün std :: locale istifadə edin

Lokalların performansını necə yavaşlatdığına dair bir nümunə üçün. UNIX (1) 20x nisbətində sıralayın, bu köhnə cavaba baxın:

Bəzən bir meyar istifadə etmək lazımdır.

İdiomatik C ++ həllinin daha yaxşı optimallaşdırılması ehtimalı var, buna görə Andrey və Frerich'in həlləri hər ikisi də güclü iddialıdır.

Aşağıdakı kod gcc 4.3.2 və -O2 ilə aşağıdakı nəticələri verir:

Input1: "afoiahge m8hfw fewu8 n hv ghwvoiwbegh2390ty3t80ytgh8ghng8hg24u8b vh2vn289vh2gh28g9jfhfuweghwu2hbvgfw22ghb84ty2bgv2nfbukbvsdbvwuivbnbvbnn hf wgwg gwev wgbv23t4 1sv4gbwer14hh414ernhe 01e4g 1e 1h4ghwerh14re e4hj 14yv y344yjd1vh h 1E6"

Giriş2: təklif etdiyiniz sətir

Andrey-dən: 1: 1243, 2: 65469

Frerich-dən: 1: 1965, 2: 140818

Buna görə Andrey'nin həlli, təklif etdiyiniz həll üzərində möhkəm bir 2x sürət təklif edir. Daha yaxşı.

Strategiyası fərqli olsa da, Andrey bütün simli bir yudumla kopyaladı və sonra uyğun olmayan hissələri çıxardı, Frerich isə yalnız başlamaq üçün lazım olan hissələri kopyaladı.

Frerich'in yanaşmasını seçərdim (burada bir qədər yavaş olmasına baxmayaraq), sadəcə yaddaş narahatdırsa, istifadə olunmayan böyük nüsxələrdən qaçınmaq üçün. Dağıtımla əlaqədar bir mürəkkəb varsa, ayrılmış yaddaş həcmini tənzimləyə bilərsiniz.

İstifadə etməzdən əvvəl son sətirdə ehtiyat (2000) çağırmağa çalışın. Həm də arqument olaraq konst ref götürün.

Unix-də isalpha funksiyasının Unicode-u dəstəkləmək üçün daha çox iş gördüyündən şübhələnirəm və yalnız ASCII aralığı ilə maraqlanırsınız. Hələ də böyük bir sıçrayış, ancaq bunu (([i] & lt = 'Z' & amp & amp [i] & gt = 'A' 'da) || (in [i] & gt = kimi) xüsusi bir müqayisə ilə əvəz edə bilərsiniz. 'a' & amp & amp [i] & lt = 'z')).

Təklif edirəm ki, vaxt alan isalpha () çağırışı deyil, iki std :: string :: operator [] çağırışı və / və ya std :: string :: operator + = çağırışıdır.

Yəqin ki, istinad üçün bir iterator istifadə edərək bu dövrü sürətləndirə bilərsiniz, beləliklə std :: string :: operator [] dan qaçın və std :: string :: push_back istifadə edərək xarakter əlavə etmək daha sürətli olacaq və əvvəlcə final ilə eyni başlanğıc tutumu.

Dəyişdirilməmiş giriş sətrini konst arayışı kimi ötürmək də kömək edə bilər, ancaq funksiyanı təkrarən çağırırsınızsa əhəmiyyətli olacaq.

Bütün bunlar, mən profilerdən istifadə etməyinizi və ya həqiqi performans donuzunu ortaya çıxarmaq üçün koda zamanlama cihazları əlavə etməyinizi qətiyyətlə tövsiyə edirəm. Təklif etdiyiniz vaxtların ehtimalı görünmür - düşünürəm ki, burada başqa bir şey olur.


Videoya baxın: Split By Attributes Using Arc Gis (Sentyabr 2021).