'заключительное' ключевое слово, эквивалентное для переменных в Python?

Я знаю, что это более старый вопрос, но вот шаги, которые я использовал, чтобы cassandra-driver установить на Windows 7 / Python2. У меня есть окна 10 / Python3 дома, где я буду тестировать это сегодня вечером. Я подтвердил, что это также работает в Windows 10 с Python 2 и 3.

Проблема

Command "python setup.py egg_info" failed with error code 1 in c:\users\Frito\appdata\local\temp\pip-build-7dgmdc\cassandra-driver

TL; DR Решение

Решение (Мне хотелось бы, чтобы кто-то объяснил, почему это сработало)

  • Попытка pip install cassandra-driver и полученное выше сообщение об ошибке
  • Попытка pip install --pre cassandra-driver и получила следующую ошибку
distutils.errors.DistutilsError: Setup script exited with error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat).
Get it from http://aka.ms/vcpython27

Command "c:\users\Frito\.virtualenvs\symdash\scripts\python.exe -u -c "import setuptools, tokenize;__file__='c:\\users\\Frito\\appdata\\local\\temp\\pip-build-sesxxu\\cassandra-driver\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record  c:\users\Frito\appdata\local\temp\pip-ujsxsk-record\install-record.txt --single-version-externally-managed --compile --install-headers c:\users\Frito\.virtualenvs\symdash\include\site\python2.7\cassandra-driver"  failed with error code 1 in  c:\users\Frito\appdata\local\temp\pip-build-sesxxu\cassandra-driver
blockquote>
  • Установлен Microsoft Visual C++ Compiler for Python 2.7
  • Успешно выполнен pip install --pre cassandra-driver
  • Успешно выполнен pip uninstall cassandra-driver
  • Успешно выполнен pip install cassandra-driver

Чтобы повторить, я не совсем уверен, почему это сработало. В настоящее время мои два основных вывода заключаются в том, что либо компилятор C ++ требуется , либо , который запускает параметр --pre, в первый раз установил некоторые зависимости, отсутствующие в «обычной» установке. Я буду обновлять сегодня после работы, когда у меня появятся дополнительные подробности.

50
задан Steve 29 April 2009 в 03:22
поделиться

9 ответов

Наличие в Java переменной final означает, что после присвоения переменной вы не можете переназначить эту переменную для указания на другой объект. Это на самом деле не означает, что объект не может быть изменен. Например, следующий код Java работает отлично:

public final List<String> messages = new LinkedList<String>();

public void addMessage()
{
    messages.add("Hello World!");  // this mutates the messages list
}

, но следующее даже не скомпилируется:

public final List<String> messages = new LinkedList<String>();

public void changeMessages()
{
    messages = new ArrayList<String>();  // can't change a final variable
}

Итак, ваш вопрос о том, существует ли final в Python. Это не так.

Однако, Python имеет неизменные структуры данных. Например, хотя вы можете изменить список , вы не можете изменить кортеж . Вы можете изменить набор , но не frozenset и т. Д.

Мой совет - просто не беспокоиться о применении немутации на уровне языка и просто сосредоточиться на что ты не

58
ответ дан 7 November 2019 в 10:31
поделиться

По состоянию на 2019 и PEP 591, Python имеет Final тип. Это не будет доступно в стандартной библиотеке до релиза Python 3.8, но до тех пор можно использовать его через эти расширения ввода библиотека. Это не будет работать final работы в Java, хотя, поскольку Python является все еще динамически типизированным языком. Но если Вы будете использовать его вместе со статическим средством проверки типа как mypy, то это принесет Вам очень похожую пользу.

существует также final декоратор, который может быть применен для маркировки методов класса как финал и препятствующий быть переопределенным. Снова это только проверяется во "время компиляции", таким образом, необходимо было бы включать статическое средство проверки типа в рабочий процесс.

2
ответ дан 7 November 2019 в 10:31
поделиться

Python 3.8 (через PEP 591) добавляет Final переменные, функции, методы и классы. Вот некоторые способы использовать его:

@final Декоратор (классы, методы)

from typing import final

@final
class Base:
    # Cannot inherit from Base

class Base:
    @final
    def foo(self):
        # Cannot override foo in subclass

Final аннотация

from typing import final

PI: Final[float] = 3.14159     # Cannot set PI to another value
KM_IN_MILES: Final = 0.621371  # Type annotation is optional

class Foo:
    def __init__(self):
        self.bar: Final = "baz"   # Final instance attributes only allowed in __init__
4
ответ дан 7 November 2019 в 10:31
поделиться

There is no ``final'' equivalent in Python.

But, to create read-only fields of class instances, you can use the property function.

Edit: perhaps you want something like this:

class WriteOnceReadWhenever:
    def __setattr__(self, attr, value):
        if hasattr(self, attr):
            raise Exception("Attempting to alter read-only value")

        self.__dict__[attr] = value
65
ответ дан 7 November 2019 в 10:31
поделиться

Такого не существует. В целом отношение Python звучит так: «Если вы не хотите, чтобы это изменилось, просто не изменяйте его». В любом случае, клиенты API вряд ли будут просто осматривать ваши недокументированные внутренние компоненты.

Вы могли бы, я полагаю, обойти это, используя кортежи или именованные кортежи для соответствующих битов вашей модели, которые по своей природе неизменны. Это по-прежнему не помогает с любой частью вашей модели, которая, конечно, должна быть изменчивой.

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

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

7
ответ дан 7 November 2019 в 10:31
поделиться

Переменная, назначаемая один раз, является проблемой проектирования. Вы разрабатываете свое приложение таким образом, что переменная устанавливается один раз и только один раз.

Однако, если вы хотите проверять свой проект во время выполнения, вы можете сделать это с помощью обертки вокруг объекта.

class OnePingOnlyPleaseVassily( object ):
    def __init__( self ):
        self.value= None
    def set( self, value ):
        if self.value is not None:
            raise Exception( "Already set.")
        self.value= value

someStateMemo= OnePingOnlyPleaseVassily()
someStateMemo.set( aValue ) # works
someStateMemo.set( aValue ) # fails

Это неуклюже но он обнаружит проблемы проектирования во время выполнения.

9
ответ дан 7 November 2019 в 10:31
поделиться

http://code.activestate.com/recipes/576527/ defines a freeze function, although it doesn't work perfectly.

I would consider just leaving it mutable though.

3
ответ дан 7 November 2019 в 10:31
поделиться

Python has no equivalent of "final". It doesn't have "public" and "protected" either, except by naming convention. It's not that "bondage and discipline".

6
ответ дан 7 November 2019 в 10:31
поделиться

you can simulate something like that through the descriptor protocol, since it allows to define reading and setting a variable the way you wish.

class Foo(object):

  @property
  def myvar(self):
     # return value here

  @myvar.setter
  def myvar(self, newvalue):
     # do nothing if some condition is met

a = Foo()
print a.myvar
a.myvar = 5 # does nothing if you don't want to
5
ответ дан 7 November 2019 в 10:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: