Python как изменить название переменной во всем коде

I have written a code in Python3 using the IDE Wing, but I want to change a variable name, e.g., var_1, to var_2 in all places in my file. In MATLAB, when you change a variable name in one place, by

I have written a code in Python3 using the IDE Wing, but I want to change a variable name, e.g., var_1, to var_2 in all places in my file. In MATLAB, when you change a variable name in one place, by Shift+Enter it is automatically done for all other occurrences of that variable in the file. Is there any similar way to do it in Python?

asked Jul 7, 2017 at 16:59

CLAUDE's user avatar

CLAUDECLAUDE

2741 gold badge2 silver badges10 bronze badges

1

You can accomplish this using nearly any text editor you want by using the Find and Replace feature.

The normal keyboard shortcut (including python’s IDLE) for this is Ctrl+H, though different editors have different shortcuts.

answered Jul 7, 2017 at 17:00

Jacobm001's user avatar

Jacobm001Jacobm001

4,3504 gold badges32 silver badges50 bronze badges

In WingIDE you have the option via the Refactor Menu to do Rename Symbol.

This does an intelligent replace, and also takes care of distinguishing global variable from class attributes with the same name.

answered Jul 7, 2017 at 17:08

Anthon's user avatar

AnthonAnthon

65.7k29 gold badges179 silver badges236 bronze badges

If you’re using the Python Idle(GUI) you can Ctrl + H and select Replace All.

answered Jul 7, 2017 at 17:01

Luis's user avatar

LuisLuis

2741 gold badge5 silver badges17 bronze badges

Visual Studio Code is Ctrl + Shift + L and begin typing.
Sublime/Atom are alt + F3.

answered Jul 7, 2017 at 17:03

Pseuplex's user avatar

PseuplexPseuplex

2952 silver badges12 bronze badges

If you’re using the PyCharm IDE use Mayus + F6 on the variable that you want change and write the new name variable.

answered Jul 7, 2017 at 17:02

VIX's user avatar

VIXVIX

5973 silver badges15 bronze badges

I have written a code in Python3 using the IDE Wing, but I want to change a variable name, e.g., var_1, to var_2 in all places in my file. In MATLAB, when you change a variable name in one place, by Shift+Enter it is automatically done for all other occurrences of that variable in the file. Is there any similar way to do it in Python?

asked Jul 7, 2017 at 16:59

CLAUDE's user avatar

CLAUDECLAUDE

2741 gold badge2 silver badges10 bronze badges

1

You can accomplish this using nearly any text editor you want by using the Find and Replace feature.

The normal keyboard shortcut (including python’s IDLE) for this is Ctrl+H, though different editors have different shortcuts.

answered Jul 7, 2017 at 17:00

Jacobm001's user avatar

Jacobm001Jacobm001

4,3504 gold badges32 silver badges50 bronze badges

In WingIDE you have the option via the Refactor Menu to do Rename Symbol.

This does an intelligent replace, and also takes care of distinguishing global variable from class attributes with the same name.

answered Jul 7, 2017 at 17:08

Anthon's user avatar

AnthonAnthon

65.7k29 gold badges179 silver badges236 bronze badges

If you’re using the Python Idle(GUI) you can Ctrl + H and select Replace All.

answered Jul 7, 2017 at 17:01

Luis's user avatar

LuisLuis

2741 gold badge5 silver badges17 bronze badges

Visual Studio Code is Ctrl + Shift + L and begin typing.
Sublime/Atom are alt + F3.

answered Jul 7, 2017 at 17:03

Pseuplex's user avatar

PseuplexPseuplex

2952 silver badges12 bronze badges

If you’re using the PyCharm IDE use Mayus + F6 on the variable that you want change and write the new name variable.

answered Jul 7, 2017 at 17:02

VIX's user avatar

VIXVIX

5973 silver badges15 bronze badges

В этом руководстве мы собираемся обсудить процесс name mangling в Python и то, как мы можем использовать различные методы в процессе изменения имени в Python.

Изменение имени

Процесс, в котором любой заданный идентификатор с одним конечным подчеркиванием и двумя ведущими подчеркиваниями текстуально заменяется на __ClassName__Identifier, известен как Name mangling (изменение имени). В __ClassName__Identifier name ClassName – это имя текущего класса, в котором присутствует идентификатор.

Иллюстрация

По сути, приведенное выше определение искажения имени означает, что любой идентификатор в такой форме, как __Jtp (либо по крайней мере два ведущих подчеркивания, либо не более одного подчеркивания в конце имени) будет заменен на __ClassName__Jtp (имя текущего класса заменит ClassName) с начальным подчеркиванием в полоску в ClassName.

Посмотрите на следующий пример, чтобы понять процесс изменения имени.

Пример:

 
# A testing class for identifier 
class Testing:  
    # Giving Name as an identifier 
    def __init__(self, name): 
         # Identifier initializing 
        self.__name = name  
    def PrintName(self):  
        print(self.__name)  
t1 = Testing("JavaTpoint") # Calling variable name with the class 
t1.PrintName() # Printing name in the output 

Выход:

JavaTpoint 

Объяснение:

Мы определили тестовый класс с идентификатором имени в классе в приведенной выше программе. Внутри класса тестирования мы определили две функции по умолчанию и одну с PrintName().

В функции PrintName() мы задали команду печати для печати имени. Затем мы инициализировали переменную t1 с помощью класса тестирования. Наконец, мы использовали PrintName() для печати имени, которое мы использовали в классе Testing при его инициализации.

Примечание. Если мы попытаемся получить доступ к функциям и переменным класса Testing вне класса, это вызовет ошибку. Любые изменения, внесенные в переменную, указанную внутри класса тестирования, могут быть выполнены только внутри класса.

Пример 2:

 
# A testing class for identifier 
class Testing:  
    # Giving Name as an identifier 
    def __init__(self, name): 
         # Identifier initializing with double underscore 
        self.__name = name  
    def PrintName(self):  
        print(self.__name)  
t1 = Testing("JavaTpoint") # Calling variable name with the class 
t1.PrintName() # Printing name in the output 
# Accessing identifier outside the class 
print(t1.__name) # will throw an error in the output 

Выход:

JavaTpoint 
Traceback(most recent call last): 
  File "C:UsersManishDownloadscode.py", line 12, in  
    print(t1.__name) # will throw an error in the output 
AttributeError: 'Testing' object has no attribute '__name' 

Реализация процесса изменения имен в Python такая же, как мы обсуждали выше. Мы будем использовать различные методы в нашей программе Python для реализации процесса изменения имен и доступа к переменным в нем.

В этом разделе мы выполним следующие задачи:

  • Изменение имени в Python с помощью метода dir().
  • Доступ к измененным именам переменных в программе.
  • Изменение имени с переопределением метода в Python.

Мы будем использовать программу для каждого метода, чтобы понять его реализацию на Python.

1. Изменение имени с помощью метода dir()

Мы можем использовать метод dir() для выполнения процесса изменения имени, и это будет сделано для класса, указанного в коде. Интерпретатор Python будет изменять имя класса. Мы можем использовать метод dir(), передав в нем определенный объект класса, и метод dir() вернет все допустимые атрибуты, принадлежащие данному объекту класса.

Посмотрите на следующий пример программы, чтобы понять этот метод изменения имени dir().

Пример:

 
# A testing class for name mangling 
class Testing:  
    def __init__(self, name):  
        self.__name = name 
# Initializing variable with the testing class 
t1 = Testing("JavaTpoint") 
# Using dir() method on initialized variable 
print(dir(t1)) 

Выход:

['_Testing__name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

Объяснение:

Когда мы смотрим на вывод, мы видим, что метод dir(), который мы использовали для инициализированной переменной, то есть t1, вернул все допустимые атрибуты тестирования класса и напечатал их. Мы также можем видеть, что имя идентификатора, то есть __name, изменено интерпретатором на _Testing__name.

2. Доступ к измененным именам переменных

Мы можем получить доступ к измененным именам переменных даже за пределами класса и напечатать входящие выходные данные (в отличие от доступа к переменной класса, которая вернет ошибку). Чтобы получить доступ к измененным именам переменных вне класса, нам просто нужно добавить _ClassName с переменной, и мы также можем вывести значение на выходе.

Посмотрите на следующую программу, в которой мы получили доступ к измененным именам переменных вне тестового класса.

Пример:

 
# A testing class for name mangling 
class Testing:  
    def __init__(self, name):  
          self.__name = name 
# Initializing variable with the testing class 
t1 = Testing("JavaTpoint") 
# Accessing Name mangled variables outside testing class 
print("The name mangled that we are accessing outside the class: ", t1._Testing__name) 

Выход:

The name mangled that we are accessing outside the class:  JavaTpoint 

Объяснение:

Мы смогли получить доступ к переменной __name снаружи, так как это была переменная с измененным именем, и она возвращала значение имени в выводе.

3. Изменение имени с помощью переопределения метода

Поскольку мы используем процесс изменения имени в нашей программе, мы ограничены из-за небольшой поддержки допустимого варианта использования членов из частного класса. Ограниченная поддержка допустимого варианта использования частного члена класса состоит в том, чтобы избежать конфликтов имен различных имен с именами, определенными внутри подклассов.

Пока процесс изменения имени будет происходить в соответствии с определением класса Python, он будет выполняться интерпретатором. И для подклассов в программе очень полезно позволить им переопределять методы, даже не прерывая вызовы межклассового метода.

Давайте разберемся в следующем примере.

 
# A default testing class for name mangling 
class Testing:   
    def __init__(self):   
        self.__jtp()  # name mangling with the Jtp variable 
    def jtp(self):  # default function for name mangling in parent class 
        print("Name mangling process done inside the parent testing class")   
    # copy of jtp() method for private class members 
    __jtp = jtp     # Name mangling with method overriding process 
# A subclass for Testing class 
class SubTesting(Testing):   
    # Providing new signature for jtp() function 
    def jtp(self):           
        print("Name mangling process done inside the child sub-testing class")  
# Calling the objects from subclass and function of it  
obj = SubTesting()  
obj.jtp() 

Выход:

Name mangling process done inside the parent testing class 
Name mangling process done inside the child sub-testing class 

Заключение

Во-первых, мы узнали о введении процесса изменения имени в этом руководстве. Мы также узнали, как можно использовать метод dir() для изменения имен в Python. Затем мы получили доступ к измененным именам переменных вне класса, в котором они присутствуют. Наконец, мы также узнали о том, как использовать процесс изменения имени с переопределением метода в данных подклассах в программе.

Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.

Цитата
Сообщение от Matan!
Посмотреть сообщение

Эта технология была раньше в Python?

Это не технология, а особенность реализации.
В Python все есть объект. У объекта есть свойство __dict__, которое содержит динамические атрибуты в виде словаря.
(Можно и не обращаться напрямую к __dict__, так как есть соответствующие глобальные функции setattrgetattr)
Модуль в Python это тоже объект. И он тоже имеет свой внутренний __dict__ с инициализированными переменными, и прочими именами верхнего уровня (классыфункции).
И в этот словарь можно также записывать новые пары keyvalue, создавая тем самым новые переменные.

Python
1
2
3
4
5
6
7
8
9
10
11
12
>>> import requests
>>> requests.__dict__["x"]=1
>>> from requests import x
>>> x
1
>>> requests.__dict__["x"]=5 # изменили
>>> x # здесь все еще старое значение
1
>>> from requests import x # импортируем заново
>>> x  # теперь новое
5
>>>

Цитата
Сообщение от Matan!
Посмотреть сообщение

В каких случаях она применялась?

Для программистов подобная динамика нужна не для того, чтобы втихую плодить кучу неявных переменных, а для более осмысленных вещей: например, для динамической привязки методов своему классу. Когда в класс нужноможно в рантайме добавить совершенно новый метод, который ранее не был определен для него.
Также все это абсолютно логично используется для всяких волшебств метапрограммирования :-)
Я в нем не знаток, но если заглянуть в дебри фреймворков типа Django, то там оно (метапрограммирование) используется особо рьяно.

Добавлено через 17 минут
Забыл добавить, что динамически в Python можно вообще много чего создать.
Например, класс.
Пример с хабра:

Python
1
2
3
4
5
6
7
8
9
10
11
12
CustomSuperUser = type(
    # Название класса
    'SuperUser',
    # Список классов, от которых новый класс наследуется
    (User, ),  
    # Атрибуты и методы нового класса в виде словаря
    {  
        '__doc__': 'Encapsulate domain logic to work with super users',  
        'group_name': 'admin',  
        'login': property(lambda self: f'{self.group_name}/{self.name}'.lower()),  
    }  
)

А стандартный синтаксис создания класса не более чем сахар поверх этого.

В процессе изменения имени любой идентификатор с двумя ведущими знаками подчеркивания и одним _classname__identifier где имя класса — это имя текущего класса. Это означает, что любой идентификатор формы __geek (не менее двух ведущих подчеркиваний или не более одного подчеркивания в конце) заменяется на _classname__geek, где имя класса — это имя текущего класса с удаленными ведущими подчеркиваниями.

Пример:

class Student:

def __init__( self , name):

self .__name = name

def displayName( self ):

print ( self .__name)

s1 = Student( "Santhosh" )

s1.displayName()

print (s1.__name)

Выход

Сантош
Отслеживание (последний вызов последний):
  Файл "/home/be691046ea08cd2db075d27186ea0493.py", строка 14, в 
    печать (s1 .__ имя)
AttributeError: объект "Студент" не имеет атрибута "__name"

В приведенном выше примере переменная класса __name недоступна за пределами класса. Доступ к нему возможен только внутри класса. Любое изменение переменной класса может быть выполнено только внутри класса.

Процесс изменения имени

С помощью метода dir() мы можем увидеть процесс изменения имени, который выполняется для переменной класса. Процесс изменения имени был выполнен переводчиком. Метод dir() используется путем передачи объекта класса и возвращает все допустимые атрибуты, принадлежащие этому объекту.

Выход

[‘_Student__name’, ‘__class__’, ‘__delattr__’, ‘__dict__’, ‘__dir__’, ‘__doc__’, ‘__eq__’, ‘__format__’, ‘__ge__’, ‘__getattribute__’, ‘__gt__’, ‘__hash__’, ‘__init__’, ‘__le__’, ‘__lt__’, ‘__module__’, ‘__ne__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’, ‘__weakref__’]

Приведенный выше вывод показывает dir() возвращающий все допустимые атрибуты с процессом изменения имени, который выполняется для переменной класса __name. Имя изменено с __name на _Student__name.

Доступ к переменным с измененным именем

Процесс изменения имени помогает получить доступ к переменным класса извне. Доступ к переменным класса можно получить, добавив к нему _classname. Изменение имени ближе всего к частному, а не к частному.

class Student:

def __init__( self , name):

self .__name = name

s1 = Student( "Santhosh" )

print (s1._Student__name)

Выход

 Сантош

Доступ к указанной выше переменной класса осуществляется путем добавления к ней _classname. Доступ к переменной класса осуществляется извне класса с именем _Student__name.

Изменение имени с переопределением метода

Из-за искажения имен существует ограниченная поддержка допустимого варианта использования для частных членов класса, в основном, чтобы избежать конфликтов имен имен с именами, определенными подклассами. Любой идентификатор формы __geek (не менее двух ведущих подчеркиваний или не более одного подчеркивания в конце) заменяется на _classname__geek, где имя класса — это имя текущего класса с удаленными ведущими подчеркиваниями. Пока это происходит в определении класса, это искажение выполняется. Это полезно для того, чтобы позволить подклассам переопределять методы без прерывания вызовов методов внутри класса.
Давайте посмотрим на этот пример и попробуем выяснить, как работает это подчеркивание:

Пример:

Map class :

def __init__( self ):

self .__geek()

def geek( self ):

print ( "In parent class" )

__geek = geek

class MapSubclass( Map ):

def geek( self ):

print ( "In Child class" )

obj = MapSubclass()

obj.geek()

Выход:

В родительском классе
В детском классе

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение — базовый уровень.

Понравилась статья? Поделить с друзьями:
  • Python google translate error
  • Python base64 binascii error incorrect padding
  • Pytest error not found
  • Pygame error unsupported image format
  • Pygame error failed loading libvorbisfile 3 dll не найден указанный модуль