পাইথনে একটি ফাংশন দুটি যুক্তি স্থানান্তর কিভাবে?


11

পাইথন ফাংশনে ডেকে আমি কীভাবে দুটি যুক্তি বদল করতে পারি?

যদি আমি pointএই দুটি আর্গুমেন্টের মধ্যে স্পেস রাখি :

self.assertEqual(json.loads(some.data), json_data)

এবং তারপরে M-t( transpose-words), আমি পেয়েছি:

self.assertEqual(json.loads(some.json), data_data)

অন্যদিকে সিএমটি ( transpose-sexps) এর সাথে আমি পেয়েছি:

self.assertEqual(json.loadsjson_data, (some.data))

আমি যা চাই তা হ'ল:

self.assertEqual(json_data, json.loads(some.data))

কোন আদেশ আছে যে তা করবে?


2
আমি চেষ্টা করি নি তবে অ্যাঙ্কার্ড ট্রান্সপোজ এর জন্য ব্যবহার করা যেতে পারে; যদিও এটি একটি 2-পদক্ষেপ প্রক্রিয়া।
कौशल মোদী

একটি মূল ফাংশন বলা হয় transpose-subrযা একটি forwardফাংশন নেয় এবং একটি ফাংশনে অনুবাদ করে transpose। সুতরাং আমরা যদি c-forward-arglist(ফাংশনটি একটি ফাংশন থেকে অন্য দিকে চলে যেতে পারি - এএএএএফসিটি এটি উপস্থিত নেই) আমাদের থাকবে c-transpose-arglist
ব্রেন্ডন

উত্তর:


4

এটি এমন একটি জিনিস যা আমি খুব দীর্ঘ সময়ের জন্য চেয়েছিলাম এবং এখানে আমি এটিতে কাজ করার জন্য কিছু প্রেরণা খুঁজে পেয়েছি। এটি সম্ভবত খুব দৃust় নয়, তবে প্রথম চেষ্টাতে মনে হয়েছে যে আমি যে মামলাগুলি চেষ্টা করেছি তা কভার করে:

(defun my/calculate-stops ()
  (save-excursion
    (let ((start
           (condition-case e
               (while t (backward-sexp))
             (error (point))))
          stops)
      (push start stops)
      (condition-case e
          (while t
            (forward-sexp)
            (when (looking-at "\\s-*,")
              (push (point) stops)))
        (error (push (point) stops)))
      (nreverse stops))))

(defun my/transpose-args ()
  (interactive)
  (when (looking-at "\\s-") (backward-sexp))
  (cl-loop with p = (point)
           with previous = nil
           for stop on (my/calculate-stops)
           for i upfrom 0
           when (<= p (car stop)) do
           (when previous
             (let* ((end (cadr stop))
                    (whole (buffer-substring previous end))
                    middle last)
               (delete-region previous end)
               (goto-char previous)
               (setf middle (if (> i 1) (- (car stop) previous)
                              (string-match "[^, \\t]" whole 
                                            (- (car stop) previous)))
                     last (if (> i 1) (substring whole 0 middle)
                            (concat (substring whole (- (car stop) previous) middle)
                                    (substring whole 0 (- (car stop) previous)))))
               (insert (substring whole middle) last)))
           (cl-return)
           end do (setf previous (car stop))))

স্থানটি যখন পয়েন্টে থাকে তখন আমি এটি পাই (কমাতে থাকাকালীন কাজ করে): আসুন *: ভুল টাইপ যুক্তি: পূর্ণসংখ্যা-বা-চিহ্নিতকারী-পি, শূন্য
ক্রড ল্যাংশন

@ ক্রডল্যাংশন ফিক্সটি তুলনামূলকভাবে সহজ ছিল (উপরে দেখুন)। মজার বিষয়টি আমি স্টিফানের পরামর্শ অনুসরণ করার চেষ্টা করে একটি বিকল্প forward-sexp-functionলিখেছিলাম এবং এটি কমাগুলির কারণে খুব জটিল বলে মনে হয়েছিল। আমি তখন traspose-sexpএকই জিনিসটি করার জন্য অনুলিপি করার চেষ্টা করেছি এবং আবারও কমাতে অ্যাকাউন্ট নেওয়া এটিকে সত্যই কঠিন করে তুলেছে। আমি দাবি করি না যে এই সবসময় সঠিক কাজটি যখন ডিলিমিটারদের তালিকা করতে আসে, সম্ভবত কেবলমাত্র অর্ধেক সময় ...
wvxvw

(aa, bb)কার্সার প্রথমটি যখন হয় তখন এটি ব্যর্থ হয় a। এটাও পক্ষান্তরিত জন্য কাজ করে না পক্ষান্তরিত আপ একরকম messes। FOO(aaa *, bbb, ccc)*
ধারণাগুলি 42

FOO(&aaa, bbb)(এবং অদলবদল করে না) এর জন্যও ব্যর্থ হয় ।
ধারণাগুলি 42

4

আপনি transpose-sexpsযে বিবরণটি বর্ণনা করেছেন এবং জিনিসগুলি দ্বারা বিচ্ছিন্ন-কমা দ্বারা স্থানান্তরিত করেছেন বা কেবল নিয়মিত করে তা হ'ল আমি তার পরিবর্তনের জন্য ব্যবহার করি transpose-sexps। এটি কার্সারটিকে সামনে টেনে না রেখে জায়গায় রেখে দেয় যা কিছুটা আলাদা তবে আমি ব্যক্তিগতভাবে পছন্দ করি।

(defun my-transpose-sexps ()
  "If point is after certain chars transpose chunks around that.
Otherwise transpose sexps."
  (interactive "*")
  (if (not (looking-back "[,]\\s-*" (point-at-bol)))
      (progn (transpose-sexps 1) (forward-sexp -1))
    (let ((beg (point)) end rhs lhs)
      (while (and (not (eobp))
                  (not (looking-at "\\s-*\\([,]\\|\\s)\\)")))
        (forward-sexp 1))
      (setq rhs (buffer-substring beg (point)))
      (delete-region beg (point))
      (re-search-backward "[,]\\s-*" nil t)
      (setq beg (point))
      (while (and (not (bobp))
                  (not (looking-back "\\([,]\\|\\s(\\)\\s-*" (point-at-bol))))
        (forward-sexp -1))
      (setq lhs (buffer-substring beg (point)))
      (delete-region beg (point))
      (insert rhs)
      (re-search-forward "[,]\\s-*" nil t)
      (save-excursion
        (insert lhs)))))

আমার জন্য এটি assertEqual কল (স্পেসের পয়েন্ট দিয়ে শুরু) এর শুরুতে শ্বেতস্থান ছেড়ে দেয়।
করড ল্যাংশন 4'15

1
এটি কীওয়ার্ড আর্গুমেন্টগুলির মতো কাজ করে না: f(a=1, b=2)(এটি প্রায় স্থানান্তরিত হয়)
এট

1
প্রশ্নটি সীমাহীন সি কোড থাকা অবস্থায়, এই উত্তরটির জন্য কাজ করে f(a=1, b=2)- emacs.stackexchange.com/a/47930/2418
ধারণাগুলি 42

2

SMIE ব্যবহার করে এমন মোডগুলিতে, transpose-sexpসেই ক্ষেত্রে সঠিকভাবে কাজ করা উচিত। তারা এখনও ব্যর্থ হবে যখন ইনফিক্স প্রতীক (ওরফে "বিভাজক") একটি ,(বা ক ;) নয় তবে একটি শব্দ (যেমন and)।

সুতরাং, আমার মতামতটি হ'ল এর জন্য আদেশটি হ'ল transpose-sexpএবং যখন এটি সঠিকভাবে কাজ করে না, আমি এটিকে একটি বাগ হিসাবে বিবেচনা করি (তবে একটি বাগ যা শক্ত হতে পারে এবং / অথবা ঠিক করার জন্য সময় নিতে পারে এবং স্বল্প-অগ্রাধিকার থাকতে পারে, তাই ডন ' টি আপনার শ্বাস রাখা)। এটির সমাধানের উপায়টি forward-sexp-functionএকটি ফাংশনে সেট করা যা জেনে যাবে যে "আমি কমা দেখার পরে, আমি কেবল পুরো যুক্তি ঘুরিয়েই আছি"।


1
আমার ধারণা জাভা-মোড (উদাহরণস্বরূপ) এসএমআইই ব্যবহার করে না? কীভাবে কেউ এটি ঠিক করতে চলেছেন?
স্যামুয়েল এডউইন ওয়ার্ড

1
না, প্রকৃতপক্ষে, সি-এর মতো ভাষার প্রধান মোডগুলি এসএমআইই ব্যবহার করে না এবং কেবল historicalতিহাসিক কারণে নয়: এসএমআইই'র পার্সার এই ভাষাগুলির জন্য খুব দুর্বল। এটি বলেছে, এসএমআইই এর পার্সার ঠিকঠাক কাজ করবে যদি আপনি কমা দ্বারা পৃথক দুটি যুক্তি অদলবদল করতে চান (ব্যাকরণের এই অংশটি যথেষ্ট সহজ), সুতরাং আমি অনুমান করি যে এসএমআইই কনফিগার করা এবং এটির জন্য ব্যবহার করা সম্ভব হবে forward-sexp-functionতবে আপনি চাইতেন কেবলমাত্র এসএমআইই ব্যবহার করতে কিছু কোড যুক্ত করতে forward-sexp-function যেখানে এটি যথেষ্ট ভাল কাজ করে, যেহেতু অন্যান্য অনেক ক্ষেত্রে এর বিভ্রান্তিমূলক আচরণ হতে পারে।
স্টেফান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.