Как препятствовать тому, чтобы Vista требовал повышения на patch.exe?

is является оператором равенства идентичности (функционирующим как id(a) == id(b)); просто два одинаковых числа не обязательно являются одним и тем же объектом. По соображениям производительности некоторые маленькие целые числа являются memoized , поэтому они будут иметь тенденцию быть одинаковыми (это можно сделать, поскольку они являются неизменяемыми).

PHP ===, с другой стороны, описывается как проверка равенства и типа: x == y and type(x) == type(y) в соответствии с комментарием Пауло Фрейтаса. Этого достаточно для общих чисел, но отличается от is для классов, которые определяют __eq__ абсурдным образом:

class Unequal:
    def __eq__(self, other):
        return False

PHP, по-видимому, допускает то же самое для «встроенных» классов (что Я подразумеваю реализацию на уровне C, а не в PHP). Немного менее абсурдным использованием может быть объект таймера, который имеет различное значение каждый раз, когда он используется как число. Весьма почему вы хотели бы эмулировать Visual Basic Now, а не показывать, что это оценка с time.time(), которую я не знаю.

Грег Хьюджилл (OP) сделал один пояснительный комментарий «Моя цель это сравнение идентичности объекта, а не равенства стоимости. За исключением чисел, где я хочу рассматривать идентичность объекта так же, как равенство стоимости. "

У этого был бы еще один ответ, поскольку мы должны классифицировать вещи как числа или нет, чтобы выбрать, сравнивать ли мы с == или is. CPython определяет протокол number , включая PyNumber_Check, но это не доступно из самого Python.

Мы могли бы попытаться использовать isinstance со всеми которые мы знаем, но это неизбежно было бы неполным. Модуль типов содержит список StringTypes, но не NumberTypes. Начиная с Python 2.6, встроенные числовые классы имеют базовый класс numbers.Number , но он имеет ту же проблему:

import numpy, numbers
assert not issubclass(numpy.int16,numbers.Number)
assert issubclass(int,numbers.Number)

Кстати, NumPy будет производить отдельные экземпляры с низкими номерами.

На самом деле я не знаю ответа на этот вариант вопроса. Я предполагаю, что теоретически можно использовать ctypes для вызова PyNumber_Check, но даже эту функцию обсуждали , и это, конечно, не переносимо. Мы просто должны быть менее конкретными в отношении того, что мы тестируем сейчас.

В конце концов, эта проблема связана с тем, что Python первоначально не имел дерева типов с предикатами, такими как Scheme number? или класса Haskell Num . is проверяет идентификацию объекта, а не равенство значения. PHP также имеет красочную историю, где ===, по-видимому, ведет себя как is только на объектах в PHP5, но не на PHP4 . Таковы растущие трудности перемещения по языкам (включая версии одного).

14
задан scobi 10 February 2009 в 20:03
поделиться

2 ответа

От:
http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/bf4f7dfa-5553-41d3-9c8e-311ee4a88599/

, Если можно добавить декларацию к затронутому исполняемому файлу, объявив requestedExecutionLevel 'asInvoker', это должно прекратить запрашивать.

Связанное руководство по архитектуре контроля учётных записей и преобразовывающий существующие приложения, таким образом, они работают правильно (около нижней части, пятой из страницы):

http://technet.microsoft.com/en-us/library/cc709628.aspx

Наконец, как записать такую декларацию:

http://www.google.com/search?q=writing+a+uac+manifest

-Adam

5
ответ дан 1 December 2019 в 14:33
поделиться

Проблема в том, что ваше приложение не содержит манифест сборки с requiredExectutionLevel .

Предпосылки

Все правильно написанные приложения Windows должны иметь сборку манифест. А начиная с 2006 года одним из элементов, которые вам необходимы, является requiredExecutionLevel , который указывает, может ли ваше приложение работать, только если пользователь является администратором.

Если ваше приложение не имеет манифеста сборки , или если у него нет requiredExecutionLevel Windows будет считать, что это унаследованное приложение, и будет делать что-то, чтобы оно, надеюсь, продолжало работать.

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

  • setup
  • update
  • patch

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

Если приложение не имеет манифеста сборки, значит, оно не является корректно написанным приложением Windows.

Правильное решение

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

Образец манифеста UAC "asInvoker":

<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
         <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" />
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly> 
5
ответ дан 1 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

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