Есть ли способ добиться сужения типа путем проверки с помощью функции?

Хорошо, вот что я делаю.

sys.argv всегда то, что вы вводите в терминал или используете в качестве пути к файлу при выполнении его с помощью python.exe или pythonw.exe

Например, вы можете запустить файл text.py несколькими способами, каждый из них даст вам другой ответ, который всегда дает вам путь, на который был набран python.

    C:\Documents and Settings\Admin>python test.py
    sys.argv[0]: test.py
    C:\Documents and Settings\Admin>python "C:\Documents and Settings\Admin\test.py"
    sys.argv[0]: C:\Documents and Settings\Admin\test.py

Хорошо, вы знаете, что можете получить файл имя, большое дело, теперь, чтобы получить каталог приложений, который вы можете знать, используйте os.path, а именно abspath и dirname

    import sys, os
    print os.path.dirname(os.path.abspath(sys.argv[0]))

. Это выведет это:

   C:\Documents and Settings\Admin\

it всегда будет выводить это независимо от того, вводите ли вы python test.py или python «C: \ Documents and Settings \ Admin \ test.py»

Проблема с использованием __file__ Рассмотрим эти два файла test.py

import sys
import os

def paths():
        print "__file__: %s" % __file__
        print "sys.argv: %s" % sys.argv[0]

        a_f = os.path.abspath(__file__)
        a_s = os.path.abspath(sys.argv[0])

        print "abs __file__: %s" % a_f
        print "abs sys.argv: %s" % a_s

if __name__ == "__main__":
    paths()

import_test.py

import test
import sys

test.paths()

print "--------"
print __file__
print sys.argv[0]

Вывод «python test.py»

C:\Documents and Settings\Admin>python test.py
__file__: test.py
sys.argv: test.py
abs __file__: C:\Documents and Settings\Admin\test.py
abs sys.argv: C:\Documents and Settings\Admin\test.py

Вывод «python test_import.py»

C:\Documents and Settings\Admin>python test_import.py
__file__: C:\Documents and Settings\Admin\test.pyc
sys.argv: test_import.py
abs __file__: C:\Documents and Settings\Admin\test.pyc
abs sys.argv: C:\Documents and Settings\Admin\test_import.py
--------
test_import.py
test_import.py

Так как вы можете видеть файл, вы всегда получаете файл python, из которого он запускается, где sys.argv [0] дает вам файл, который вы использовали из интерпретации всегда. В зависимости от ваших потребностей вам нужно будет выбрать, какой из них лучше всего подходит вашим потребностям.

2
задан benwaffle 13 July 2018 в 21:41
поделиться

1 ответ

Typcript поддерживает это со специальным типом возврата, X is A. Вы можете прочитать об этом подробнее в своем разделе о пользовательских типах охранников .

В качестве примера вы можете ввести его так:

class A {}
class B extends A {
  bb() { ... }
}

function isB(obj: A): obj is B { // <-- note the return type here
  return obj instanceof B;
}

const x: A = new B(); // x has type A
if (isB(x)) {
  x.bb(); // x is now narrowed to type B
}
4
ответ дан CRice 17 August 2018 в 12:07
поделиться
Другие вопросы по тегам:

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